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