STM32H7 的 DCache 与 DMA 一致性:地址对齐、Cache 维护与 MPU 配置的实战避坑

· 5 浏览

回答(4)

小技巧:用__ALIGNED(32)宏定义缓冲区,并确保长度是32的倍数,可减少维护开销。
码农小张 · 2026-10-14
MPU配置Non-Cacheable时,记得同时设置Shareable和Non-Bufferable,否则DMA可能仍读到旧值。
H7玩家 · 2026-10-14
补充:使用SCB_InvalidateDCache_by_Addr前,若该区域有未写回数据,应先Clean再Invalidate,否则丢数据。
嵌入式老鸟 · 2026-10-14
STM32H7的DCache与DMA一致性核心是:DMA不经过Cache直接访问内存,而CPU可能读写Cache中的旧数据。实战避坑:1) 地址对齐:DMA缓冲区必须按Cache行大小(通常32字节)对齐,且大小为其整数倍,否则Cache维护会误伤相邻数据。可用__attribute__((aligned(32)))定义。2) Cache维护:发送前用SCB_CleanDCache_by_Addr()清理(写回),接收后用SCB_InvalidateDCache_by_Addr()无效化(丢弃),注意地址和长度要对齐到行边界。3) MPU配置:将DMA缓冲区所在内存区域配置为Write-Through或Non-Cacheable,可一劳永逸避免一致性问题,但会牺牲性能。推荐对高频小数据用Cache维护,大数据流用MPU Non-Cacheable。4) 注意DMA描述符和FIFO也要考虑对齐。5) 调试时若发现数据错乱,优先检查Cache维护是否遗漏或地址未对齐。
mcuku 阿沐 · 2026-10-14