打印
[STM32F1]

FSMC同时外挂LCD和SRAM时 自动调用外部RAM和LCD错行显示问题

[复制链接]
1389|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32的FSMC总线是带总裁的外部接口,该总线有4个BANK区,BANK1区又分4个block(其他的米有研究过)。当内存不够时可以外挂SRAM,也可挂载LCD,它们可以挂在BANK1上。
在我的系统中使用RT-thread操作系统,外挂SRAM和160*160单色LCD,接下来如何使用外部RAM这“海量存储”就成了一个愁事儿。这里有三种方法:
1、直接定位,例如_lib[1000] __attribute__((at(0x68000000)));但是这种定义的变量一多可移植性、易修改性就变差。
2、作为动态内存使用,这个功能牛掰的RTT已经替你完成,rt_system_heap_init((void*)STM32_EXT_SRAM_BEGIN, (void*)STM32_EXT_SRAM_END);
3、告诉KEIL,堆栈放在内部RAM,全局变量自动放在外部RAM(原本的企图是,如果内部RAM使用完能够自动定义到外部RAM呢!可惜没找到方法):
(1)options里定义外部RAM的起始地址以及大小,并设置为默认

(2)设置启动文件的变量存储地址为内部RAM

(3)修改驱动使SRAM和LCD挂在在BANK1区的不相邻block去,我选择LCD在block1,SRAM在block3,这里说明在不同block区的原因:测试时LCD挂在block4的,但发现读写SRAM的信号对LCD存在串扰,使LCD出现错行显示现象,在论坛里有大侠怀疑是时序问题,于是茅塞顿开,修改LCD挂在block1后一切都正常了,感冒好了,不咳嗽了,一口气儿能跳好几层楼了,咳,严肃点吧!驱动的事儿网上说的多了,不再赘述。如果你像我一样以前在相邻的block的话,主要修改点有以下几点(修改LCD的block):第一修改硬件FSMC_NE线,以及相应GPIO驱动部分,第二修改LCD的FSMC总线驱动,第三修改LCD数据输出地址。
(4)修改启动文件,使启动之后系统初始完成直接初始化外部RAM,如下:
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                IMPORT  EXT_SRAM_Configuration
                LDR     R0, =SystemInit
                BLX     R0  
                LDR     R0, =EXT_SRAM_Configuration
                BLX     R0                 
                LDR     R0, =__main
                BX      R0
                ENDP
大致过程就是这个样子了,如果你希望某些变量被定义到内部RAM,可将这些变量集中定义在一个C文件中,然后修改C文件中变量的存储位置,方法同3.(2)

沙发
pentral0311| | 2015-2-13 16:51 | 只看该作者
收藏了

使用特权

评论回复
板凳
zchong| | 2015-2-14 09:52 | 只看该作者
同一个“block”,挂多个设备,需要地址译码,注意译码是否正常,不要产生毛刺
另外就是同一个"block"时序必然是一样的,如果挂的设备速度差别比较大是不太合适的
所以如果片选够用建议多用几个"block",比较灵活

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

1

粉丝