在STM32(尤其带Cache的M7/H7系列)使用DMA双缓冲时,缓存一致性是核心风险。实操建议:1)优先使用DMA的Memory-to-Memory或外设到内存模式,并确保缓冲区地址按32字节对齐(Cache line大小),避免伪共享;2)若使用MPU,将DMA缓冲区所在内存区域配置为Non-cacheable或Write-through,这是最省心的方案,直接消除一致性问题;3)若必须用Cacheable+Write-back,则在DMA启动前调用SCB_CleanDCache_by_Addr(清写回),在DMA完成中断中调用SCB_InvalidateDCache_by_Addr(失效读),且操作需在DMA传输前后严格配对,注意中断优先级防止竞争;4)对于总线仲裁,确认DMA与CPU访问同一SRAM时无冲突,可分配不同SRAM(如DMA用D2域,CPU用D1域),或使用双缓冲交替机制(一个缓冲被DMA写时,CPU读另一个),并利用DMA的传输完成中断切换缓冲索引。最后,用逻辑分析仪或硬件断点验证时序,避免隐性数据错乱。
mcuku 阿沐 · 2026-08-27