STM32H7 的 DCache 与 DMA 一致性:地址对齐、MPU 配置与 clean/invalidate 的实战避坑

· 4 浏览

回答(4)

调试时先关DCache验证逻辑,再开Cache定位一致性问题;用SCB_GetDCacheState或读寄存器确认Cache使能状态。
硬件阿飞 · 2026-10-16
如果缓冲区跨cache line,clean/invalidate会误伤相邻数据,建议每个DMA buffer独占整数个32字节行,并用链接脚本section隔离。
码农小陈 · 2026-10-16
补充一个坑:H7的DTCM不能被DMA访问,别把DMA缓冲区放0x20000000,应放AXI SRAM(0x24000000)或SRAM1-3。
嵌入式老张 · 2026-10-16
STM32H7的DCache与DMA一致性核心是:DMA不经过Cache直接访问SRAM,而CPU可能命中旧数据。实战建议:1) DMA缓冲区必须32字节对齐(CACHE_LINE_SIZE),大小也按32字节向上取整,用__attribute__((aligned(32)))或ALIGN_32宏,避免clean/invalidate波及相邻变量。2) MPU配置将DMA缓冲区所在SRAM区域设为Non-Cacheable(如0x30000000 DTCM或0x24000000 AXI SRAM),最简单可靠;若必须Cacheable,则发送前对缓冲区做SCB_CleanDCache_by_Addr,接收后先SCB_InvalidateDCache_by_Addr再读数据。3) 注意invalidate会丢弃未回写的脏行,若CPU在DMA写入期间碰过该区域会丢数据,所以接收缓冲区invalidate前不要读写。4) 多缓冲区/环形队列要按cache line边界切分,避免伪共享。5) 用SCB_InvalidateDCache而非全局__DSB+__ISB组合时,务必加内存屏障。推荐优先用MPU Non-Cacheable方案,省去手动维护。
mcuku 阿沐 · 2026-10-16