1.FSMC(Flexible Static Memory Controller)作用
STM32引入FSMC这个外设,主要是为了解决以下三个核心问题:
1. 解决CPU效率问题(替代软件模拟,解放CPU)
没有FSMC时怎么办?
如果想用普通GP口(如SPI或并口)驱动一个8080并行接口的LCD或读写SRAM,你必须使用 "软件模拟时序"(Bit-Banging)。即:
CPU执行指令 -> 置高GPIO
D0
-> 延时 -> 置低GPIOWR
-> 延时 -> 置高GPIOWR
-> 置低GPIOD0
...整个过程需要数十条甚至上百条指令来完成一次简单的写操作,CPU绝大部分时间都在循环、延时和操作GPIO,效率极低。
有了FSMC之后:
CPU只需要执行一条简单的写内存指令 (如
*(uint16_t*)0x60000000 = 0x1234;
)。FSMC硬件外设会自动在对应的物理引脚上产生出所有精确的、符合存储器协议的控制时序(地址、片选、写使能、数据等)。
优势 :CPU仅用1个时钟周期发出指令后就可以去执行其他任务,而FSMC则并行地、不占用CPU资源地去完成这次耗时且繁琐的通信过程。这对于需要高速刷屏(LCD)或频繁读写外部RAM的应用至关重要。
2. 解决存储器扩展问题(突破片上内存限制)
STM32芯片内部的SRAM(运行内存)和Flash(存储空间)容量是固定的,且成本较高。
需求场景:
运行复杂的GUI界面或算法,需要大量内存来存储帧缓存和数据。
需要存储大量数据(如语音、图片、历史日志),内部Flash不够用。
FSMC的作用:
它提供了与外部大容量存储器(如1MB的SRAM、16MB的NOR Flash)的标准连接方式。
通过FSMC,这些外部存储器被映射到STM32的地址空间里,CPU可以像访问内部内存一样直接访问它们,从而实现存储空间的"无缝扩容"。
3. 解决复杂外设的高效控制问题(简化接口,提高速度)
很多复杂外设使用并行接口,因为它们需要高速传输大量数据,最典型的就是 TFT液晶屏。
FSMC的巧妙之处在于,它把外设也"当作存储器"来访问。
LCD控制器通常有两个寄存器:命令寄存器 和 数据寄存器。
FSMC通过一根地址线(例如A0)来区分这两个寄存器:
当A0=0时,访问命令寄存器。
当A0=1时,访问数据寄存器。
2.存储器映射(Memory Mapping) 的原理
一、存储器映射的核心原理:统一的地址空间
1. 核心思想:
计算机系统(包括微控制器MCU)的核心原理是 "一切皆文件" 的抽象思想在硬件上的体现------"一切外设皆内存"。
处理器(CPU)并不直接认识UART、SPI、GPIO、SRAM或LCD这些外设。它只认识一种东西:内存地址。CPU的工作就是从一个地址读取数据,或将数据写入另一个地址。
存储器映射就是为CPU的整个可寻址空间(例如32位CPU的4GB空间)制定一个规划图,将不同的物理设备(如Flash、RAM、寄存器)分配到这个规划图中的特定地址范围。当CPU访问某个地址时,实际上是在与映射到该地址的物理设备进行通信。
2. 一个简单的类比:电话总机系统
想象一个大型公司的电话总机系统,总机号码是
0-0000
到4-9999
(4GB空间)。
0-0000
到1-9999
:内部员工分机(映射到内部Flash和SRAM)。拨这些号,总机会自动帮你转接到对应的员工座机。
2-0000
到2-9999
:外部客户热线(映射到FSMC的Bank1)。拨这些号,总机会自动帮你拨通外部客户的电话。
3-1000
:空调控制系统(映射到GPIO寄存器)。拨这个号并说"1",总机会帮你打开空调。
3-1001
:灯光控制系统(映射到另一个寄存器)。拨这个号并说"0",总机会帮你关灯。在这个系统中,你(CPU)不需要知道对方是内部员工、外部客户还是空调。你只需要记住一个电话号码(地址),然后打电话(读写操作)即可。总机(存储器映射系统)会自动帮你完成正确的连接。
3. 在STM32中的体现:
STM32内核(如Cortex-M3/M4)的4GB地址空间被预先划分好:
0x0000 0000
-0x1FFF FFFF
(512MB): 用于映射代码区域(内部Flash)。
0x2000 0000
-0x3FFF FFFF
(512MB): 用于映射内部SRAM。
0x4000 0000
-0x5FFF FFFF
(512MB): 用于映射外设寄存器 (如GPIO, USART, SPI等)。你配置GPIO输出高电平,其实就是向0x4002 1000
这样的地址写入一个值。
0x6000 0000
-0x9FFF FFFF
(1GB): 这就是留给FSMC 的区域!用于映射外部存储器。
二、 FSMC如何实现扩容
1. 核心机制:基于地址解码的硬件代理
地址空间划分:FSMC将Cortex-M内核的4GB线性地址空间中的固定段(如0x6000 0000 - 0x9FFF FFFF)预留为其控制区域。CPU对该地址段的任何访问操作都会被总线架构自动路由至FSMC控制器,而非内部存储器或外设。
信号转换与时序生成 :FSMC作为一个高度可配置的状态机,负责将CPU的简单读写指令翻译并扩展为符合目标设备物理接口协议的完整时序:
片选管理 :根据访问地址的高位自动断言相应的片选信号(
NE[4:1]
),实现多设备寻址。地址/数据总线复用 :输出访问偏移地址(
A[25:0]
),并驱动双向数据总线(D[15:0]
)进行数据传输。协议信号生成 :精确产生读使能(
NOE
)、写使能(NWE
)等控制信号。可编程时序控制 :通过配置寄存器(如
BTR
)独立设置地址建立(ADDSET
)、数据建立(DATAST
)等参数,以适配不同速度的存储器件。
2. 实现扩容的本质:硬件抽象与资源解耦
FSMC的"扩容"体现在两个层面:
物理存储扩展 :通过提供标准并行接口,FSMC允许STM32连接远超其片内集成能力的大容量SRAM、PSRAM或NOR Flash。CPU可像访问内部内存一样,直接通过指针读写这些外部存储单元,实现了物理存储边界的透明化扩展。
外设功能扩展 :FSMC支持将非存储类并行设备 (如8080/6800接口的TFT LCD、FPGA、ASIC)模拟为存储器进行访问。这是通过将设备的功能寄存器(如LCD的命令/数据寄存器)映射到不同的FSMC地址来实现的。访问特定地址时,FSMC会通过特定的地址线(如
A0
)电平变化来区分操作类型,从而高效控制外设。
3. 性能优势:超越软件模拟的硬件加速
FSMC从根本上提升了系统效率:
卸载CPU负担 :将繁琐的并行时序生成工作从CPU(软件模拟)移交至专用硬件控制器(FSMC),实现了通信过程的硬件加速。CPU仅需发起单次总线访问,其后可立即返回执行核心任务,极大减少了指令开销和总线占用。
确定性的高性能:基于硬件的信号生成确保了时序的精确性和高速度(可达数十MHz),其性能是软件模拟无法企及的,尤其适用于GUI帧缓冲、大数据块传输等高速应用场景。