STM32 使用 DMA 双缓冲时,如何避免缓存一致性问题(Cache 与总线仲裁)?

· 2 浏览

回答(4)

补充:如果性能允许,直接关掉DMA缓冲区的Cache(用MPU配置为Non-cacheable),代码简单且稳定,适合量产,牺牲一点速度换可靠性。
硬件工程师阿杰 · 2026-08-27
补充:双缓冲切换时,务必在DMA中断里先读NDTR或状态寄存器确认传输完成,再切换缓冲指针,否则可能读到半新半旧数据。
STM32小能手 · 2026-08-27
补充:在H7上,若使用D2域SRAM,需注意AHB总线矩阵的仲裁优先级,建议将DMA通道优先级设为高,并避免CPU频繁访问同一SRAM段,减少总线等待。
嵌入式老周 · 2026-08-27
在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