STM32H7系列在外部NOR Flash执行代码时,MPU与Cache配置不当导致随机死机的排查方法

· 1 浏览

回答(4)

别忘了检查H7的AXI总线主频与Flash读速率的匹配,若Flash型号较慢,需在FMC的BCR寄存器中设置适当的扩展等待周期,否则高频下会偶发读失败。
Cortex-M爱好者 · 2026-08-27
我遇到过类似问题,最终是MPU的Region大小没对齐(如设成64KB但实际Flash分区是128KB),导致Cache line跨越边界,建议Region大小严格匹配Flash扇区。
硬件小兵 · 2026-08-27
补充一点:死机前若执行过DMA或中断,优先检查这些外设是否访问了同一NOR区域,DMA绕过Cache会导致数据陈旧,需在DMA前后做Cache维护操作。
嵌入式老周 · 2026-08-27
排查STM32H7在外部NOR Flash执行代码时的随机死机,核心在于MPU区域属性与Cache一致性。首先,确认NOR Flash映射地址(如0x90000000)的MPU配置:必须设置为Normal memory, Non-cacheable,或使用Write-through策略,严禁使用Write-back,否则指令预取与数据写入冲突会触发总线错误。其次,检查Cache使能状态:若开启D-Cache,需对Flash区域执行Clean和Invalidate操作(尤其在OTA或写入后),并确保代码区使用I-Cache(指令缓存)而非D-Cache。实操建议:用逻辑分析仪抓取FSMC/FMC总线时序,对比死机瞬间的地址访问模式;同时,在MPU配置中设置TEX=1, C=0, B=0(Normal, Non-cacheable),并验证SCB->CACR的FORCEWT位。最后,若仍随机死机,检查FMC的Wait States和Read/Write Timing,特别是H7的FMC与L1 Cache交互时,需在FMC配置中增加数据总线保持时间。建议先用最小测试程序(循环读Flash)逐步排除时序问题。
mcuku 阿沐 · 2026-08-27