没志青年
发布于 2025-06-24 / 30 阅读
0

32单片机 - FSMC、FMC 接口

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 没有区别,可以直接用指针读写。

需要注意的点:

  1. 访问速度 外部存储器速度通常比内部 SRAM 慢很多,所以 FSMC/FMC 需要设置等待周期(WAIT STATE)。不然可能读写错误。

  2. 缓存一致性 高端系列(比如 STM32F7/H7 带 D-Cache)在访问外部存储器时要注意 Cache 配置,否则可能出现数据不同步问题。

  3. 堆栈/全局变量放置 默认情况下,编译器/链接器只会把数据放到内部 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 引脚的对应关系:

SDRAM引脚

FMC外设引脚

说明

CLK

FMC_SDCLK

CKE

FMC_SDCKE [ 1 : 0 ]

FMC外设支持最多2个sdram芯片

\overline{CS}

FMC_SDNE [ 1 : 0 ]

片选信号,连接两个芯片

\overline{CAS}

FMC_NCAS

\overline{RAS}

FMC_NRAS

\overline{WE}

FMC_SDNWE

DQM [ 1 : 0 ]

FMC_NBL [ 3 : 0 ]

BS [ 1 : 0 ]

FMC_A [ 15 : 14 ]

FMC最多支持4个Bank,2条线有4种逻辑

A [ 12 : 0 ]

FMC_A [ 12 : 0 ]

DQ [ 15 : 0 ]

FMC_D [ 31 : 0 ]

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接口的屏幕,没有显存,需要我们自己提供显存,并控制数据。