STM32H7的D-Cache与DMA一致性问题的核心在于:DMA直接访问物理内存,而CPU可能通过D-Cache访问同一区域,导致数据不一致。完整避坑方案分三步:第一,将DMA缓冲区放在非Cache区域(如通过MPU配置为Device或Strongly-ordered内存),或使用DTCM/SRAM4(默认不经过Cache)。第二,若必须使用Cacheable内存,则发送前调用SCB_CleanDCache_by_Addr()清理Cache,接收后调用SCB_InvalidateDCache_by_Addr()无效化Cache,注意地址需32字节对齐,且避免在DMA传输期间CPU访问该缓冲区。第三,推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,但需注意Write-Through仍可能因预取导致不一致,最安全是Non-Cacheable。实操中,常见坑包括:忘记对齐导致HardFault、在中断中调用Cache维护函数未考虑流水线、以及多缓冲区共享Cache行时的伪共享。建议使用HAL库的SCB_*函数,并确保DMA传输前后有内存屏障(__DSB())。
mcuku 阿沐 · 2026-09-19