有8MB的外部RAM,其实使用起来也不困难.有很多方法,外部RAM和内部RAM都一起用.或者只用外部RAM等等,首先设置Keil的这个配置,让默认使用外部RAM.但是外部RAM上电是需要初始化的,所以,初始化过程就需要特别注意.
增加一个叫DATA_IN_ExtSDRAM的预定义.
系统启动到SDRAM配置成功前,SDRAM都不能调用.否则出错.查看复位向量跟踪到,他是调用SystemInit后才到main函数:
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__initial_sp ; restore original stack pointer MSR MSP, R0 LDR R0, =__main BX R0 ENDP
看到关键的SystemInit_ExtMemCtl函数,其中使用的变量都是register修饰:
void SystemInit_ExtMemCtl(void) { register uint32_t tmpreg = 0, timeout = 0xFFFF; register __IO uint32_t index; /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and GPIOH interface clock */ RCC->AHB1ENR |= 0x000000FC;
如果这时候你不能使用外部RAM并且没有内部RAM时候,就只能如此.那么假设有内部RAM的情况.有两个办法,修改整个文件的RAM分布,或者只修改某个变量分布.比如修改文件的分布属性:
当然这等于修改了SCT文件.写一个简单的程序,直接申请一个很大的变量,大小超过内部RAM即可.比如我出填充一个0x50008大小的变量块.仿真时效率比较低,但是可以看看内存申请在哪里.
并且能正确写入读出:
不过外部SDRAM速度确实一般般啊.即使是全速运行,不知道为何.