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)
|