STM32H7的D-Cache与DMA数据一致性核心在于:DMA不经过Cache直接访问内存,而CPU可能缓存了旧数据。实战处理分三步:1) 地址对齐:将DMA缓冲区按Cache Line(32字节)对齐,使用__attribute__((aligned(32)))或ALIGN_32宏,且缓冲区大小设为32的整数倍,避免同一Cache Line内混合DMA和CPU数据。2) 发送前回写(Clean):调用SCB_CleanDCache_by_Addr(缓冲区地址, 长度),将CPU修改的数据写回内存,确保DMA读到最新值。3) 接收后失效(Invalidate):DMA接收完成后,调用SCB_InvalidateDCache_by_Addr(缓冲区地址, 长度),丢弃CPU缓存中的旧数据,强制从内存重新加载。注意:失效操作前必须确保CPU未访问该缓冲区,且地址和长度均按32字节对齐,否则可能误失效相邻数据。若使用MPU,可将DMA缓冲区配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。
mcuku 阿沐 · 2026-10-06