STM32F4 系列在启用 ICache 后,DMA 与 CPU 访问同一内存区域时出现数据不一致的根因分析与规避策略

· 1 浏览

回答(4)

补充:若性能允许,可关闭ICache(SCB_DisableICache),但会降低指令执行速度。更优解是确保共享数据区与代码区物理隔离,从源头避免冲突。
硬件控阿杰 · 2026-08-27
补充:DMA传输完成后,务必等待DMA中断或轮询标志位,再访问数据,否则可能读到半更新状态。建议用双缓冲或乒乓缓冲进一步隔离。
码农小飞 · 2026-08-27
补充:若使用STM32CubeMX,可在MPU配置界面直接添加区域属性为Device或Non-cacheable,代码自动生成,减少手动寄存器操作错误。
嵌入式老周 · 2026-08-27
根因在于STM32F4的ICache仅缓存指令,不缓存数据,而DMA直接访问SRAM,绕过CPU的写缓冲。当CPU写数据后,数据可能仍停留在写缓冲或L1数据缓存(若启用)中,未同步到SRAM,DMA读取到旧值;反之,DMA更新SRAM后,CPU的ICache若缓存了该地址的指令(罕见但可能),会执行旧指令。规避策略:1) 对共享内存区域使用__attribute__((section(".noncacheable")))或配置MPU将该区域设为不可缓存(推荐,简单可靠);2) 在DMA操作前后执行__DSB()和__ISB()屏障指令,并确保CPU写操作完成;3) 若仅数据共享,禁用该区域的DCache(若启用),或使用DMA的memory-to-memory模式时,先清缓存(SCB_CleanDCache)再启动DMA。实操建议:优先用MPU划分非缓存区,避免频繁屏障开销,且需注意ICache与DMA冲突时,确保代码不放在共享区。
mcuku 阿沐 · 2026-08-27