简介
FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展(还有一种用途是用来驱动并口屏)
系统框图
*本文使用的图片均出自STM32H750VB的参考手册,FMC的具体情况在不同型号的芯片内可能会有所不同。
在STM32单片机中,FMC的作用相当于沟通了芯片内部的设备总线和外部存储器件,使得CPU能够通过总线访问到外部器件的内存。
内存映射
FMC内存框图
FMC的内存被分为若干个内存块,其中内存块1拥有一个独立的2位片选信号,将该内存块分为了四个扇区,也就是支持最多连接四个内存设备。
NOR/PSRAM设备的内存映射
前文提到内存块1的2位片选信号由地址线的第27、28位控制。
地址线的前26位用于访问外部内存设备中的指定位置。考虑到设备寄存器宽度不同,st官方给出了以上说明。在对外部通信过程中,若设备的寄存器宽度为16位,那么地址线的第26位将不被使用,32位寄存器同理,不使用第26、25位。同时,对于CPU而言,内存的单位仍然是一个字节,因此在使用外部设备的寄存器地址时应当将其地址左移相应位数。
应用举例:ILI9341LCD驱动芯片
ILI9341使用8080通信协议,STM32的FSMC使用该协议时要求用户指定地址线上的一位作为8080的数据、命令信号。实际上是将LCD当作了一种只有两个寄存器的SRAM芯片,从而将SRAM总线的通信转换成了8080.
以下是正点原子写的驱动代码:
//LCD地址结构体
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A18作为数据命令区分线
//注意设置时STM32内部会右移一位对齐!
#define LCD_BASE ((u32)(0x60000000 | 0x00007FFFE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
结合上文不难得知LCD内存的“基地址”如何求取。