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