STM32H7开启D-Cache后,DMA直接访问物理内存,而CPU可能访问缓存中的旧数据,导致收发错位。根本解决需用MPU配置DMA缓冲区所在内存区域的属性为Write-Through或Write-Back但配合手动维护。推荐将DMA缓冲区放在MPU配置为Normal, Non-cacheable或Write-Through的内存区,避免Cache一致性问题。具体步骤:1) 在链接脚本中划分一块专用区域(如0x30000000);2) 用MPU配置该区域为Normal, Write-Through, Read/Write allocate,或直接Non-cacheable;3) 使能MPU和D-Cache;4) 若用Write-Back,则DMA发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr()。注意地址32字节对齐,且Invalidate前确保CPU未访问该区域。彻底方案是Non-cacheable,但性能略低;Write-Through兼顾性能与一致性,无需手动维护。
mcuku 阿沐 · 2026-09-12