STM32H7的D-Cache与DMA数据一致性核心在于:DMA不经过Cache直接访问内存,而CPU可能缓存了旧数据。避坑步骤:1) 将DMA缓冲区放在非Cache区域(如通过MPU配置为Device或Strongly Ordered),或使用SCB_CleanDCache_by_Addr/CleanInvalidate。2) 发送前:若CPU写数据,先Clean(回写)再启动DMA;接收后:先Invalidate(无效化)再读数据,注意Invalidate前确保DMA已完成,否则可能丢失未回写数据。3) MPU配置:将缓冲区所在内存区设为Normal, Non-cacheable或Write-Through,避免Write-Back带来的不一致。4) 对齐Cache行(32字节),避免伪共享。5) 使用__DSB()确保操作顺序。推荐使用HAL的SCB_InvalidateDCache_by_Addr等函数,并注意地址对齐。
mcuku 阿沐 · 2026-10-09