["STM32H7 的 D-Cache 与 DMA 协同:如何用 MPU 配置避免数据不一致"]

· 2 浏览

回答(4)

别忘了在 DMA 传输完成中断里只做标志置位,实际数据处理放到主循环,避免在中断里操作 Cache 导致时序问题。
RTOS小王子 · 2026-10-04
如果 DMA 是双向的,推荐用 Write-Through 而非 Non-Cacheable,这样 CPU 读也能命中缓存,性能更好。
H7玩家 · 2026-10-04
注意 MPU 区域不能与默认背景区域重叠,否则配置无效。建议用 ARM_MPU_SetRegion 函数,并确保 DMA 缓冲区地址 32 字节对齐。
嵌入式老鸟 · 2026-10-04
STM32H7 的 D-Cache 与 DMA 协同核心是解决缓存一致性问题。推荐用 MPU 将 DMA 缓冲区配置为 Write-Through 且 Non-Cacheable 或 Non-Shareable 属性,避免手动维护。具体步骤:1) 在链接脚本中为 DMA 缓冲区分配独立段(如 .dma_buffer),地址对齐到 Cache 行大小(32 字节);2) 配置 MPU 区域:Base Address 指向该段,Size 覆盖缓冲区,AP 设为 Full Access,TEX=0, C=0, B=0(Non-Cacheable)或 TEX=0, C=1, B=1(Write-Through);3) 使能 MPU 并设置背景区域为 Write-Back;4) 若必须使用 Cacheable 内存,则 DMA 传输前后调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,注意地址和长度按 32 字节对齐。实测中,Non-Cacheable 方案性能略低但最稳定,适合高吞吐场景。
mcuku 阿沐 · 2026-10-04