26. FMC—扩展外部SDRAM — [野火]STM32库开发实战指南——基于野火挑战者开发板 文档
电脑的内存条实际上是由很多内存颗粒(SDRAM芯片)组成的一个模块。
而单片机直接与一个SDRAM芯片连接。
含有 FMC 外设的单片机才能连接SDRAM,FSMC不支持SDRAM,支持SRAM,但SRAM成本比SDRAM高。
FMC 比 FSMC 高级。
SRAM:
IS61LV25616AL-10TL:512KB
IS61LV51216AL-10T:1MB
IS62WV51216BLL-55TLI:1MB
STM32 使用 FSMC 外扩了 RAM,会映射到MCU片上地址空间。从 CPU 的角度看,访问外部 SRAM 和访问内部 SRAM 没有区别,可以直接用指针读写。
需要注意的点:
访问速度 外部存储器速度通常比内部 SRAM 慢很多,所以 FSMC/FMC 需要设置等待周期(WAIT STATE)。不然可能读写错误。
缓存一致性 高端系列(比如 STM32F7/H7 带 D-Cache)在访问外部存储器时要注意 Cache 配置,否则可能出现数据不同步问题。
堆栈/全局变量放置 默认情况下,编译器/链接器只会把数据放到内部 SRAM。如果想让某些数组或堆放到外部 RAM,需要修改链接脚本或用 attribute((section(".ext_sram"))) 之类的方式。启动文件中好像也要改。
可以使用第三方的库来管理内存,比如 FreeRTOS 的 heap_4.c
FSMC
Flexible Static MemoryController,可变静态存储控制器,FSMC。
FSMC 可驱动:
SRAM
NOR FLASH
NAND FLSAH
PC卡
含有FSMC的芯片:
STM32F103:大容量且引脚100以上
STM32F4
FSMC 和芯片的连接,在 数据手册中,不过在CubeMx中看起来更方便。

FMC
Flexible Memory Controller 可变存储控制器,FMC
FMC 可驱动
SRAM
SDRAM
NOR FLASH
NAND FLSAH
FMC 外设结构
STM32F429

FMC 引脚与 SDRAM 引脚的对应关系:
FMC 地址映射
使用FMC连接存储器时,存储单元是映射到STM32的内部寻址空间的,因此可以直接像操作内部存储一样操作SDRAM,FMC外设自动完成与SDRAM的交互。区别于 I2C EEPROM、SPI FLASH,需要手动控制数据传输。

左侧为Cortex-M4内核的存储空间分配,右侧为 FMC 外设的地址映射。
可以看出,单个SDRAM芯片的最大容量为 256 MB,但实际上,市面上的 SDRAM 芯片很少大于 64MB。
SDRAM位于External device 区域,意味着不能直接执行代码。
External RAM区域,能直接执行代码。
STM32 的 FMC设计的不合理之处:NAND Flash、PC卡不支持直接执行代码,却占用了大量的空间,另外这个PC卡淘汰的东西了,使用场景太少了。
通过配置“SYSCFG_MEMRMP”寄存器的“SWP_FMC”寄存器位可用于交换SDRAM与NAND/PC卡的地址映射, 使得存储在SDRAM中的代码能被执行,只是由于SDRAM的最高同步时钟是90MHz,代码的执行速度会受影响。
SDRAM 控制寄存器
SDRAM 硬件设计
FMC 程序
显存驱动RGB屏幕
使用SPI或8080接口通信的屏幕,其内置了驱动芯片,显存在其中,因此只需要写入数据就行了。
而RGB接口的屏幕,没有显存,需要我们自己提供显存,并控制数据。