STM32H7 的 D-Cache 与 DMA 一致性踩坑:MPU 配置与 clean/invalidate 的正确顺序

· 2 浏览

回答(4)

注意:SCB_InvalidateDCache_by_Addr在DMA完成中断里调用,且要确保DMA传输已真正结束(查TC标志或中断)。
驱动小王子 · 2026-10-12
实测发现,用MPU将DMA区域设为Non-Cacheable后,性能损失可接受,比手动维护Cache省心得多。
H7玩家 · 2026-10-12
补充:如果缓冲区跨Cache行,invalidate会丢弃相邻数据,务必对齐到32字节边界,长度也取整。
嵌入式老鸟 · 2026-10-12
STM32H7的D-Cache与DMA一致性问题核心在于:DMA不经过Cache,而CPU访问可能命中Cache,导致数据不一致。正确做法:1) 用MPU将DMA缓冲区配置为Non-Cacheable(如配置为Normal, Non-cacheable或Device),这是最稳妥的方案,避免手动维护。2) 若必须用Cacheable,则发送前调用SCB_CleanDCache_by_Addr()将CPU写入的数据写回内存;接收前调用SCB_InvalidateDCache_by_Addr()无效化Cache,防止CPU读到旧数据。注意顺序:发送:先Clean再启动DMA;接收:先Invalidate再启动DMA,且Invalidate必须在DMA完成之后、CPU读取之前。3) 地址必须32字节对齐,长度也按32字节向上取整,否则Cache行部分操作会误伤相邻数据。4) 避免在DMA传输过程中CPU访问同一缓冲区。推荐优先使用MPU配置Non-Cacheable区域,简单可靠。
mcuku 阿沐 · 2026-10-12