STM32F1 系列芯片使用 FSMC 外设来管理扩展的存储器,FSMC 是 Flexible Static Memory Controller 的缩写,译为灵活的静态存储控制器。它可以用于驱动包括 SRAM、NOR FLASH 以及 NAND FLSAH 类型的存储器,不能驱动如 SDRAM这种动态的存储器而在 STM32F429 系列的控制器中,它具有 FMC 外设,支持控制 SDRAM存储器。
中文参考手册对FSMC的描述:
接下来是FSMC的结构框图:
在框图的右侧是 FSMC 外设相关的控制引脚,由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多,其中地址线 FSMC_A和数据线 FSMC_D是所有控制器都共用的。
AHB时钟(HCLK)是FSMC的参考时钟。
其中比较特殊的 FSMC_NE 是用于控制 SRAM 芯片的片选控制信号线,STM32 具有FSMC_NE1/2/3/4 号引脚,不同的引脚对应 STM32 内部不同的地址区域。例如,当 STM32访问 0x68000000-0x6BFFFFFF 地址空间时,FSMC_NE3 引脚会自动设置为低电平,由于它连接到 SRAM的 CE#引脚,所以 SRAM的片选被使能,而访问 0x60000000-0x63FFFFFF地址时,FSMC_NE1 会输出低电平。当使用不同的 FSMC_NE 引脚连接外部存储器时,STM32 访问 SRAM 的地址不一样,从而达到控制多块 SRAM 芯片的目的。
控制寄存器:
控制 SRAM 的有FSMC_BCR1/2/3/4控制寄存器、FSMC_BTR1/2/3/4片选时序寄存器以及FSMC_BWTR1/2/3/4写时序寄存器。每种寄存器都有4个,分别对应 4个不同的存储区域,各种寄存器介绍如下:
地址映射:
这个是中文数据手册中给出的FSMC存储器地址映射:
然后在stm32内部,这1GB的空间又被具体细分:
而对于NOR / SRAM而言,存储块1用于访问最多4个NOR闪存或PSRAM存储设备。这个存储区被划分为4个
NOR/PSRAM区并有4个专用的片选。具体选择那一个小存储块,由以下决定:
图中左侧的是 Cortex-M3 内核的存储空间分配,右侧是 STM32 FSMC 外设的地址映射。可以看到 FSMC的NOR/PSRAM/SRAM/NAND FLASH以及 PC卡的地址都在 External RAM地址空间内。正是因为存在这样的地址映射,使得访问 FSMC 控制的存储器时,就跟访问STM32的片上外设寄存器一样。
使用FSMC读写内存数据的过程:
stm32种FSMC的传输时序(模式A):
读时序在FSMC_BTR寄存器中进行配置:
那么SRAM的控制模式还有一个模式1,有什么区别?中文参考手册中是这样描述的,模式A与模式1的区别是NOE的变化和相互独立的读写时序。也就是说,模式A允许我们对读 / 写操作的地址建立时间 数据读取时间等设置不同的数值。
对于模式A,我们用到的寄存器配置其实不多,stm32有规定,对于不需要使用的寄存器,应该配置成如下的值:
写操作时序: