SDRAM使用总结

最近stm32学到使用SDRAM了,板载SDRAM为IS42S16400J。

SDRAM为一种可以运行存储在存储器上的代码的存储器,stm32内部有2M的代码运行空间,一般都是够用的,如果不够用的时候就可以用SDRAM扩大代码运行空间。

SDRAM是通过FMC连接后直接映射到stm32内部寻址空间,与IIC和SPI需要操作总线不一样,操作SDRAM只需要在程序中定义一个指向这个空间的指针,通过指针直接修改存储单元内容,FMC外设会自动完成数据访问过程。

为了使FMC完成这些数据访问操作,需要在程序一开始进行初始化过程,一共包括对GPIO管脚时钟的初始化、FMC的初始化、SDRAM时序初始化。

SDRAM我觉得最重要的就是初始化过程了,初始化顺序一定要注意,一定要按照GPIO->FMC->SDRAM这个顺序初始化。

使用CubeMX创建的stm32工程需要注意,SDRAM时序初始化不能放在HAL_SDRAM_MspInit里,因为CubeMX生成的程序初始化过程是这样的,MX_FMC_Init->HAL_SDRAM_Init->HAL_SDRAM_MspInit,如果SDRAM时序初始化放在HAL_SDRAM_MspInit里,会由于FMC还没有初始化成功而导致SDRAM时序初始化失败。

我一开始就是由于不清楚这个初始化顺序,导致程序一直卡在SDRAM读写处。

读写SDRAM的话,只需要用一个指向这个空间地址的指针,然后操作这个指针指向的内容就好了。一个简单的读的例子如下。

1
2
3
4
5
6
7
uint32_t *pSDRAM;

uint32_t RadomBuffer[10000];

#<span class="meta-keyword">define</span> SDRAM_BANK_ADDR ((uint32_t)0xD0000000)

*pSDRAM=RadomBuffer[count];