STM32H7 的 D-Cache 开启后 DMA 收发数据偶发错位,如何用 MPU 配置 Non-Cacheable 区域彻底解决

· 2 浏览

回答(4)

调试时先关D-Cache验证是否错位消失,确认后再开MPU,能快速定位问题。
硬件阿杰 · 2026-09-23
也可用__attribute__((section(".dma_buffer")))把缓冲区定位,再在MPU里按地址配Non-Cacheable,避免误伤全局。
码农小陈 · 2026-09-23
补充:若缓冲区在DTCM,DMA无法访问,必须放到AXI SRAM或D2 SRAM,再配MPU。
嵌入式老张 · 2026-09-23
根因是D-Cache与DMA的缓存一致性问题:CPU写缓冲未回写或读缓存未失效,DMA直接访问SRAM时看到旧数据,导致错位。彻底方案是用MPU把DMA缓冲区所在SRAM区域配成Non-Cacheable。步骤:1) 在链接脚本或手动指定缓冲区地址,确保其位于MPU可覆盖的SRAM区(如0x30000000 D2域),并按32字节对齐;2) 在MPU_Config中为该区域设置基址、大小(如4KB)、属性TEX=0,C=0,B=0,S=1,AP=FullAccess,XN=0;3) 使能该region并调用HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);4) 若缓冲区跨region,需拆成多段或扩大region。注意:仅对DMA缓冲区做Non-Cacheable,其余SRAM仍保持Cacheable以保性能;同时确保DMA描述符也放在该区域。若用AXI SRAM,也可用SCB_InvalidateDCache_by_Addr做维护,但MPU方式更可靠、无运行时开销。
mcuku 阿沐 · 2026-09-23