STM32H753上FMC SRAM读取速度为何慢于QSPI Flash?
为什么STM32H7上QSPI Flash读速反而比FMC SRAM快?
这问题确实和直觉相悖——并行总线的SRAM居然跑不过串行的QSPI Flash,我来结合STM32H7的架构和外设特性给你拆解几个关键原因:
1. 总线带宽与传输模式的实际效率差异
虽然FMC是并行总线,但实际有效带宽不一定能打满,而QSPI的4线同步burst传输效率很高:
- QSPI在STM32H7上通常配置为4线同步模式,时钟可以跑到CPU主频的1/2(也就是200MHz,当CPU是400MHz时)。4线并行的情况下,有效数据速率是200MHz × 4 = 800MB/s(理论值)。而且QSPI支持连续burst读取,一旦启动传输,几乎没有额外的地址开销。
- 你用的评估板上的FMC SRAM是异步SRAM(比如IS61WV51216BLL),即使配置成最快的时序,FMC的时钟通常是CPU主频的1/4(100MHz),总线宽度是16位,理论带宽是100MHz × 2 = 200MB/s。而且异步SRAM每次读取都需要等待地址建立、数据稳定的时序开销,连续读取的burst效率远不如同步QSPI。
2. 缓存机制的适配性差异
你开启了D-cache和I-cache,这对QSPI的优化效果远大于FMC SRAM:
- STM32H7的缓存控制器对QSPI的内存映射区域做了专门的预取优化:当CPU发起连续读取时,缓存会自动预取后续的多个缓存行(STM32H7的缓存行是32字节),把QSPI的连续burst传输和缓存填充完美匹配,几乎消除了单次访问的延迟。
- 而FMC的异步SRAM属于“非可缓冲”的外设(或者说缓存对其预取效率极低),因为异步传输的时序不确定性,缓存控制器无法提前预取数据,每次缓存 miss 都要经历完整的异步读取时序,累积下来就拖慢了整体速度。
3. 总线架构的访问路径差异
STM32H7的AXI总线矩阵对不同外设的调度优先级和延迟不同:
- QSPI直接挂在AHB3总线上,这条总线和CPU的AXI矩阵直接相连,访问路径短,延迟低。而且AHB3支持更高的突发长度,能更好地利用缓存的预取机制。
- FMC虽然也挂在AHB3,但异步SRAM的访问需要经过FMC的时序控制器,额外增加了几个时钟周期的延迟。对比QSPI的同步传输,这个额外延迟在连续小数据读取时会被放大。
4. 测试场景的特殊性
你测试的是1KB连续数据读取,这个大小刚好是32个STM32H7的缓存行(32字节/行)。QSPI可以通过一次长burst传输把所有数据预取到缓存里,而FMC的异步SRAM需要多次独立的读取操作来填充缓存,每次操作都有时序开销,最终累积的耗时反而更长。
如果你测试更大的数据块(比如几MB),或者关闭缓存再测试,结果可能会和你的预期一致——FMC SRAM的速度会反超QSPI Flash,因为缓存的预取优势会被耗尽,而异步SRAM的并行带宽优势会体现出来。
内容的提问来源于stack exchange,提问作者Guillaume Petitjean




