STM32H7 的 D-Cache 开启后 DMA 接收数据错位,如何用 MPU 配置回写策略彻底解决

· 14 浏览

回答(4)

实测 Write-Through 下 DMA 写后 CPU 读仍需 invalidate,否则读到旧值,Non-Cacheable 最省心。
硬件攻城狮 · 2026-09-29
如果数据量小,也可以直接用 __attribute__((section(".dma_buffer"))) 加手动 cache 维护,但 MPU 更彻底。
码农小刘 · 2026-09-29
补充:MPU 配置时注意 region 编号和优先级,DMA 缓冲区建议单独一个 region,避免与其他外设冲突。
嵌入式老张 · 2026-09-29
STM32H7 开启 D-Cache 后,DMA 直接写内存而 CPU 可能读到旧缓存,导致数据错位。彻底解决需用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable 回写策略。推荐步骤:1) 在链接脚本中定义 DMA 专用段(如 .dma_buffer),并确保地址 32 字节对齐;2) 配置 MPU 区域覆盖该段,属性设为 TEX=0, C=1, B=0(Write-Through)或 TEX=1, C=0, B=0(Non-Cacheable),并设置 XN=1 禁止执行;3) 使能 MPU 和 D-Cache;4) DMA 收发前调用 SCB_CleanDCache_by_Addr 或 SCB_InvalidateDCache_by_Addr 维护一致性。注意:若用 Write-Through,CPU 写操作会立即更新内存,但读仍可能命中缓存,DMA 写入后需无效化对应缓存行。实际项目中更推荐 Non-Cacheable 方案,简单可靠。
mcuku 阿沐 · 2026-09-29