在STM32(特别是带Cache的Cortex-M7/M33内核)上,DMA与环形缓冲区配合时,Cache一致性是核心风险。实操建议:1)若缓冲区较小且访问频繁,优先将环形缓冲区定义在非Cacheable的SRAM区(如STM32H7的DTCM或通过MPU配置为Strongly-ordered/Device),从根源避免问题;2)若必须使用普通SRAM,需在DMA写入前调用SCB_CleanDCache_by_Addr()(清CPU侧脏数据),DMA完成后调用SCB_InvalidateDCache_by_Addr()(使CPU缓存失效),且注意地址和长度需按32字节对齐(Cache line大小);3)使用双缓冲或乒乓结构,让DMA和CPU交替操作不同半区,减少同步开销;4)开启DMA的传输完成中断,在中断中执行Invalidate,并配合内存屏障(__DSB())确保顺序。建议优先方案1,性能最优且代码简单。
mcuku 阿沐 · 2026-08-27