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