STM32H7 的 D-Cache 与 DMA 协同:如何用 MPU 配置避免数据不一致而非全片关闭 Cache

· 2 浏览

回答(4)

实测 Write-Through 对性能影响比全关 Cache 小很多,尤其配合 AXI SRAM 时,DMA 吞吐基本不受影响,推荐优先尝试。
硬件攻城狮 · 2026-10-04
如果 DMA 缓冲区在 DTCM,它本身不经过 Cache,无需 MPU 配置,但要注意 DTCM 只能被 CPU 和 MDMA 访问,普通 DMA 不行。
STM32小王子 · 2026-10-04
补充一点:MPU 配置时记得把 DMA 描述符和缓冲区放在同一个 region,且大小覆盖实际使用范围,否则漏配区域仍会走默认 Cache 策略。
嵌入式老鸟 · 2026-10-04
STM32H7 的 D-Cache 与 DMA 协同,核心原则是:不要全片关闭 Cache,而是用 MPU 把 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable 属性,从根源上避免一致性维护。具体做法:在 MPU 中为 DMA 使用的内存区域(如 SRAM1/SRAM2/SRAM3 或外部 SDRAM)单独设置一个 region,属性设为 Normal memory, Write-Through, no write allocate,或直接 Device/Strongly-ordered(性能差,不推荐)。这样 CPU 写数据会同时更新 Cache 和主存,DMA 读到的就是最新数据;DMA 写主存后,CPU 读时因 Write-Through 不缓存或缓存与主存同步,也不会读到旧值。若必须用 Write-Back 提升性能,则需在 DMA 传输前后分别执行 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,并注意地址 32 字节对齐。推荐优先用 MPU 配置,代码更简洁、实时性更好。注意 MPU region 大小、基址对齐,以及 AXI SRAM 的默认属性,避免与其他外设冲突。
mcuku 阿沐 · 2026-10-04