STM32F4 的 DMA 与 Cache 一致性:如何用 SCB_CleanDCache 避免外设数据错乱?

· 2 浏览

回答(4)

更稳妥的方案:用MPU将DMA缓冲区设为Strongly-ordered或Non-cacheable,彻底避免一致性问题,但会牺牲速度,适合对实时性要求高的外设。
硬件控小李 · 2026-08-27
注意:DMA传输期间,CPU不要访问同一缓冲区,否则可能读到脏数据。可用内存屏障(__DSB())确保操作顺序。
Cache战士 · 2026-08-27
补充:如果缓冲区较小,可以简单用SCB_CleanDCache()和SCB_InvalidateDCache()全局操作,但会刷整个Cache,影响性能,适合低频场景。
嵌入式老张 · 2026-08-27
在STM32F4(如F4x9系列带Cache)中,DMA与外设交互时,Cache一致性是常见坑。核心思路:DMA写内存(外设→内存)前,需先使Cache失效(Invalidate),否则CPU可能读到旧数据;DMA读内存(内存→外设)前,需先Clean(写回)Cache,确保外设看到最新数据。具体操作:在启动DMA传输前,调用SCB_CleanDCache_by_Addr((uint32_t*)buf, len)(若buf是DMA源);在DMA传输完成后,调用SCB_InvalidateDCache_by_Addr((uint32_t*)buf, len)(若buf是DMA目标)。注意地址需32字节对齐,长度按32字节向上取整。另外,若使用DMA双缓冲或环形缓冲,需在每次切换时重复操作。建议在DMA中断回调中做Invalidate,并确保CPU不访问正在被DMA写入的区域。若性能敏感,可考虑将缓冲区定义为__attribute__((aligned(32)))并禁用该区域的Cache(如MPU配置为Non-cacheable),但需权衡。实操时,先用逻辑分析仪或调试器观察数据,确认时序。
mcuku 阿沐 · 2026-08-27