OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7984|回复: 8

战舰跑ucos+ucgui+lwip系统内部RAM不够

[复制链接]

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-6-29 09:12:36 | 显示全部楼层 |阅读模式
5金钱
战舰跑ucos+ucgui+lwip系统内部RAM不够,想用外部RAM
其中液晶屏是原子历程FSMC驱动方式,会不会扩展的时候受影响?
我想除了原子那种动态分配内存的方法外还有没有其他方法,找了好多方法都不成功,有没有具体的步骤?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-6-29 18:47:35 | 显示全部楼层
尽量裁剪不必要的功能吧,减少不必要的内存消耗。
站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-6-30 00:57:43 | 显示全部楼层
我们的不能用吗?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-30 09:38:59 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
能用,但是我想用简单的方法,现在试验成功了,需要改三个地方
1首先在option->target定义好外部RAM地址
2修改启动文件,初始化FSMC
3打开system_stm3210x.c中的外部FSMC宏定义
4首先在左边将文件夹手动分配给内部存储,然后一个一个的试验,有的文件必须定义在内部存储,例如stm32或者ucos内核文件,有的就不需要,例如库函数文件。
现象:正常运行,现在用的7寸电容屏,FSMC同时驱动屏幕和外部RAM,互相不影响。
问题:长时间运行,触摸屏有时候会感应不到触摸,但是各个任务正常运行,我调试发现不能进入触摸的scan函数,然后我在电容触摸中断中如果进入中断点亮led,退出中断关闭led,结果感应不到触摸的时候这个led一闪一闪的。不知道是否跟用外部存贮有关系,还是我程序的问题?
回复

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-30 09:46:48 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
我翻了翻帖子,需要改三个地方 
1首先在option->target定义好外部RAM地址 
2修改启动文件,初始化FSMC 
 3打开system_stm3210x.c中的外部FSMC宏定义 
4首先在左边将文件夹手动分配给内部存储,然后一个一个的试验,有的文件必须定义在内部存储,例如stm32或者ucos内核文件,有的就不需要,例如库函数文件。 
 现象:正常运行,现在用的7寸电容屏,FSMC同时驱动屏幕和外部RAM,互相不影响。 
 问题:长时间运行,触摸屏有时候会感应不到触摸,但是各个任务正常运行,我调试发现不能进入触摸的scan函数,然后我在电容触摸中断中如果进入中断点亮led,退出中断关闭led,结果感应不到触摸的时候这个led一闪一闪的。以前没外部RAM的时候也碰到过,但是感觉有外部RAM的时候频繁了,不知道是否跟用外部存贮有关系,还是我程序的问题?
回复

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-30 09:50:39 | 显示全部楼层
触摸中断函数
//触摸屏中断处理
//在中断中扫描有没有有效触摸产生
void EXTI15_10_IRQHandler(void)
{
LED0(ON);
OSIntEnter();
if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
//  if(CT_INT==0)  //有触摸中断
{   
tp_dev.tpsta|=0X80;//标记有有效触摸
GUI_TOUCH_Exec();
// GUI_Exec();
}  
EXTI_ClearITPendingBit(EXTI_Line10);  //清除LINE2上的中断标志位  
// EXTI->R=1<<10;  //清除LINE10上的中断标志位  
 OSIntExit();
}
回复

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-30 09:52:11 | 显示全部楼层
//////////////////////////////////////////////////////////////////////////////////
//电阻屏电容屏共用驱动
//触摸按键扫描
//mode:该参数仅适用于电阻触摸屏;0,屏幕坐标;1,物理坐标(校准等特殊场合用)
//返回值:0,没有任何触摸;1,有触摸(正在被触摸).
u8 TP_Scan(u8 mode)
{    
u8 buf[34];//一次读取34字节 
if(tp_dev.tpsta)//有触摸按下
{
GT811_RD_Reg(CTP_READ_XY_REG,buf,34); //一次读取34个字节
tp_dev.tpsta&=0X60; //清除最低5位和最高位
tp_dev.tpsta|=buf[0]&0X1F; //触摸点标记位
if((tp_dev.tpsta&0X1F)==0)return 0; //没有任何触摸有效点
#if CTP_SWAP_XY==1 //调转XY
tp_dev.y[0]=480-(((u16)buf[2]<<8)+buf[3]); //触摸点0坐标
tp_dev.x[0]=((u16)buf[4]<<8)+buf[5];   
tp_dev.ppr[0]=buf[6];  
tp_dev.y[1]=480-(((u16)buf[7]<<8)+buf[8]); //触摸点1坐标
tp_dev.x[1]=((u16)buf[9]<<8)+buf[10];   
tp_dev.ppr[1]=buf[11];
tp_dev.y[2]=480-(((u16)buf[12]<<8)+buf[13]);//触摸点2坐标
tp_dev.x[2]=((u16)buf[14]<<8)+buf[15];   
tp_dev.ppr[2]=buf[16];    
tp_dev.y[3]=480-(((u16)buf[17]<<8)+buf[24]);//触摸点3坐标
tp_dev.x[3]=((u16)buf[25]<<8)+buf[26];   
tp_dev.ppr[3]=buf[27];
tp_dev.y[4]=480-(((u16)buf[28]<<8)+buf[29]);//触摸点4坐标
tp_dev.x[4]=((u16)buf[30]<<8)+buf[31];   
tp_dev.ppr[4]=buf[32];
#else 
tp_dev.y[0]=((u16)buf[2]<<8)+buf[3]; //触摸点0坐标
tp_dev.x[0]=800-(((u16)buf[4]<<8)+buf[5]);   
tp_dev.ppr[0]=buf[6];  
tp_dev.y[1]=((u16)buf[7]<<8)+buf[8]; //触摸点1坐标
tp_dev.x[1]=800-(((u16)buf[9]<<8)+buf[10]);   
tp_dev.ppr[1]=buf[11];
tp_dev.y[2]=((u16)buf[12]<<8)+buf[13]; //触摸点2坐标
tp_dev.x[2]=800-(((u16)buf[14]<<8)+buf[15]);   
tp_dev.ppr[2]=buf[16];    
tp_dev.y[3]=((u16)buf[17]<<8)+buf[24]; //触摸点3坐标
tp_dev.x[3]=800-(((u16)buf[25]<<8)+buf[26]);   
tp_dev.ppr[3]=buf[27];
tp_dev.y[4]=((u16)buf[28]<<8)+buf[29]; //触摸点4坐标
tp_dev.x[4]=800-(((u16)buf[30]<<8)+buf[31]);   
tp_dev.ppr[4]=buf[32];
#endif    
if((tp_dev.tpsta&TP_PRES_DOWN)==0) //之前没有被按下
{  
tp_dev.tpsta|=TP_PRES_DOWN|TP_CATH_PRES;//按键按下  
tp_dev.x0=tp_dev.x[0];//记录第一次按下时的坐标
tp_dev.y0=tp_dev.y[0];        
}    
}else if(tp_dev.tpsta&TP_PRES_DOWN) //之前是被按下的 
{
tp_dev.tpsta&=~TP_PRES_DOWN; //标记按键松开    
}
            LED0(OFF);
return tp_dev.tpsta&TP_PRES_DOWN; //返回当前的触屏状态



scan函数里面有LED0(OFF);
回复

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-30 14:24:35 | 显示全部楼层
有时候屏幕竟然翻转过来,就一个开发板一个电容屏。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-6-30 21:17:13 | 显示全部楼层
回复【8楼】yujietangying:
---------------------------------
翻转可能是受到干扰了。
至于你说的触摸屏死机,需要长时间测试,不太好仿真分析,你可以用示波器看看INT脚的波形,在死机的时候是不是还有波形?、
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 17:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表