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