STM32 使用 DMA 双缓冲传输时,如何避免 Cache 一致性问题导致的数据错乱?

· 1 浏览

回答(4)

补充:如果使用FreeRTOS,注意任务切换时可能触发Cache操作,建议在DMA回调中加临界区保护,防止中断与任务并发失效。
RTOS爱好者 · 2026-08-27
补充:可考虑使用STM32CubeMX的MPU配置向导,勾选Non-cacheable区域,并确保DMA描述符和缓冲区都放在该区域,避免遗漏。
芯片调试员 · 2026-08-27
补充:用DMA的Memory-to-Memory模式时,源和目的都需考虑Cache,建议源用Clean,目的用Invalidate,顺序不能反。
嵌入式老周 · 2026-08-27
在STM32使用DMA双缓冲且启用Cache(如H7系列)时,核心是维护数据一致性。实操建议:1) 为两个缓冲区分配在MPU中配置为Non-cacheable或Write-through属性的内存区域(如通过MPU_ConfigRegion),这样CPU读写直接访问内存,DMA无需失效操作,最简单可靠;2) 若必须用Cacheable内存,则在DMA传输完成中断中,对目标缓冲区调用SCB_InvalidateDCache_by_Addr(仅失效,不清理),确保CPU读到DMA写入的最新数据;3) 在CPU写入缓冲区后、启动DMA前,调用SCB_CleanDCache_by_Addr(清理回写),避免脏数据被DMA读取。注意:双缓冲切换时,两个缓冲区都要分别处理,且地址需按32字节对齐(Cache line大小)。建议优先使用MPU配置Non-cacheable,可彻底规避此问题,但需权衡性能损失。
mcuku 阿沐 · 2026-08-27