STM32F429 如何使用SDRAM

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZenNaiHeQiao/article/details/88117104

关于STM32F429 控制SDRAM( FMC—扩展外部SDRAM )

(1)原理介绍:https://www.cnblogs.com/firege/p/5805812.html

      》为什么是FMC 不是 FSMC ?区别在那里!
      STM32F429使用FMC外设来管理扩展的存储器,FMC是Flexible Memory Controller的缩写,译为可变存储控制器。
      它可以用于驱动包括SRAM、SDRAM、NOR FLASH以及NAND FLSAH类型的存储器。
      
      在其它系列的STM32控制器中,只有FSMC控制器(Flexible Static Memory Controller),译为可变静态存储控制器,
      所以它们不能驱动SDRAM这样的动态存储器,因为驱动SDRAM时需要定时刷新,STM32F429的FMC外设才支持该功能,
      且只支持普通的SDRAM,不支持DDR类型的SDRAM。我们只讲述FMC的SDRAM控制功能。
      
      》FMC特点:
      FMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据,这种地址访问与I2C EEPROM、SPI FLASH的不一样,
      后两种方式都需要控制I2C或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,
      并且访问时还需要使用代码控制发送读写命令。而使用FMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;
      在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FMC外设会自动完成数据访问过程,
      读写命令之类的操作不需要程序控制。

(2)关于SDRAM寄存器配置的讲解:
http://forum.armfly.com/forum.php?mod=viewthread&tid=1942
(3)SDRAM的一些学习资料:
http://forum.armfly.com/forum.php?mod=viewthread&tid=1930
在这里插入图片描述
(4)SDRAM的内存操作

使用指针的方式访问SDRAM存储器,完成初始化SDRAM后,我们就可以利用它存储数据了,由于SDRAM的存储空间是被映射到内核的寻址区域的,我们可以通过映射的地址直接访问SDRAM,访问这些地址时,FMC外设自动读写SDRAM,程序上无需额外操作。

通过地址访问内存,最直接的方式就是使用C语言的指针方式了:
/SDRAM起始地址存储空间2的起始地址/
#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) /SDRAM大小,8M字节/
#define IS42S16400J_SIZE 0x800000
uint32_t temp;
( uint8_t) (SDRAM_BANK_ADDR ) = (uint8_t)0xAA; /向SDRAM写入8位数据/
temp = ( uint8_t) (SDRAM_BANK_ADDR ); /从SDRAM读取数据/
( uint16_t) (SDRAM_BANK_ADDR+10 ) = (uint16_t)0xBBBB;/写/读 16位数据/
temp = ( uint16_t) (SDRAM_BANK_ADDR+10 );
( uint32_t) (SDRAM_BANK_ADDR+20 ) = (uint32_t)0xCCCCCCCC;/写/读 32位数据/
temp = ( uint32_t) (SDRAM_BANK_ADDR+20 );

为方便使用,代码中首先定义了宏SDRAM_BANK_ADDR表示SDRAM的起始地址,该地址即FMC映射的存储区域2的首地址;宏IS42S16400J_SIZE表示SDRAM的大小,所以从地址(SDRAM_BANK_ADDR)到(SDRAM_BANK_ADDR+IS42S16400J_SIZE)都表示在SDRAM的存储空间,访问这些地址,直接就能访问SDRAM。
配合这些宏,使用指针的强制转换以及取指针操作即可读写SDRAM的数据,使用上跟普通的变量无异。

直接指定变量存储到SDRAM空间,每次存取数据都使用指针来访问太麻烦了,为了简化操作,可以直接指定变量存储到SDRAM空间.
#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) /SDRAM起始地址存储空间2的起始地址/
uint8_t testValue attribute((at(SDRAM_BANK_ADDR)));/绝对定位方式访问SDRAM,这种方式必须定义成全局变量/
testValue = 0xDD;

这种方式使用关键字"attribute((at()))"来指定变量的地址,代码中指定testValue存储到SDRAM的起始地址,从而实现把变量存储到SDRAM上。要注意使用这种方法定义变量时,必须在函数外把它定义成全局变量,才可以存储到指定地址上。

更常见的是利用这种方法定义一个很大的数组,整个数组都指定到SDRAM地址上,然后就像使用malloc函数一样,用户自定义一些内存管理函数,动态地使用SDRAM的内存,我们在使用emWin写GUI应用的时候就是这样做的。

在本书的《MDK编译过程及文件类型全解》章节将会讲解使用更简单的方法从SDRAM中分配变量,以及使用C语言标准库的malloc函数来分配SDRAM的空间,更有效地进行内存管理。

(5)如果要把SDRAM映射到FMC SDRAM的存储区域1,需要如何修改STM32与SDRAM的硬件连接?程序上需要修改哪些内容?

猜你喜欢

转载自blog.csdn.net/ZenNaiHeQiao/article/details/88117104