STM32F7 SDRAM直接使用外部RAM

/ 0评 / 0

有8MB的外部RAM,其实使用起来也不困难.有很多方法,外部RAM和内部RAM都一起用.或者只用外部RAM等等,首先设置Keil的这个配置,让默认使用外部RAM.但是外部RAM上电是需要初始化的,所以,初始化过程就需要特别注意.
微信截图_20160529142222
增加一个叫DATA_IN_ExtSDRAM的预定义.
微信截图_20160529142320
系统启动到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分布,或者只修改某个变量分布.比如修改文件的分布属性:
微信截图_20160529143325
当然这等于修改了SCT文件.写一个简单的程序,直接申请一个很大的变量,大小超过内部RAM即可.比如我出填充一个0x50008大小的变量块.仿真时效率比较低,但是可以看看内存申请在哪里.
微信截图_20160529143701
并且能正确写入读出:
微信截图_20160529143808
不过外部SDRAM速度确实一般般啊.即使是全速运行,不知道为何.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注