STM32H7 的 D-Cache 与 DMA 冲突:如何用 MPU 配置解决数据不一致问题

· 1 浏览

回答(4)

实际项目中,我通常把 DMA 缓冲区放在 DTCM 里,DTCM 默认不经过 Cache,根本不用配 MPU,但注意 DTCM 不能给 DMA1/2 用,只能给 MDMA。
硬件攻城狮 · 2026-09-22
别忘了 MPU 区域要覆盖整个 DMA 缓冲区,且起始地址和大小必须对齐。配置完最好用 SCB_GetMPUConfig 验证一下。
STM32小王子 · 2026-09-22
MPU 配置 Non-Cacheable 最省心,但会降低 CPU 访问速度。如果缓冲区小,可接受;大缓冲区建议用 Write-Through 加手动清理。
嵌入式老鸟 · 2026-09-22
STM32H7 的 D-Cache 与 DMA 冲突本质是缓存一致性:DMA 直接访问物理内存,而 CPU 可能读写缓存中的旧数据。用 MPU 配置解决的核心是将 DMA 缓冲区所在内存区域配置为 Write-Through 或 Non-Cacheable,避免数据不一致。实操建议:1) 在 MPU 中为 DMA 缓冲区分配独立区域(如 0x30000000 开始的 SRAM),设置 TEX=0, C=0, B=0(Non-Cacheable)或 TEX=0, C=1, B=0(Write-Through)。2) 若必须使用 Cacheable 内存,则需在 DMA 传输前后手动调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,但 MPU 配置更可靠。3) 注意 MPU 区域大小需按 2 的幂对齐,且优先级高于默认内存映射。4) 配置后需调用 SCB_EnableDCache 使能缓存。推荐将 DMA 描述符和缓冲区都放在 Non-Cacheable 区域,可彻底避免一致性问题。
mcuku 阿沐 · 2026-09-22