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

· 1 浏览

回答(4)

如果 DMA 缓冲区在 DTCM,DTCM 默认不经过 Cache,无需 MPU 配置,但需确认链接脚本。
硬件攻城狮 · 2026-10-04
注意 MPU 区域大小必须是 2 的幂,且基地址对齐到区域大小,否则配置无效。
STM32小王子 · 2026-10-04
补充:也可用 `SCB_CleanDCache_by_Addr` 在 DMA 启动前清理,但频繁调用影响性能,MPU 方案更彻底。
嵌入式老鸟 · 2026-10-04
STM32H7 的 D-Cache 开启后,DMA 直接写入内存,而 CPU 可能从 Cache 读取旧数据,导致数据错位。彻底解决需用 MPU 将 DMA 缓冲区配置为 Non-Cacheable。步骤:1) 使能 MPU:在 `HAL_Init()` 后调用 `HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT)`。2) 定义 MPU 区域:使用 `MPU_Region_InitTypeDef`,设置 `Enable=MPU_REGION_ENABLE`,`Number` 选一个未用区域(如 0),`BaseAddress` 为 DMA 缓冲区地址(需 32 字节对齐),`Size` 覆盖缓冲区(如 256 字节对应 `MPU_REGION_SIZE_256B`),`SubRegionDisable=0`,`TypeExtField=0`,`AccessPermission=MPU_REGION_FULL_ACCESS`,`DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE`,`IsShareable=MPU_ACCESS_NOT_SHAREABLE`,`IsCacheable=MPU_ACCESS_NOT_CACHEABLE`,`IsBufferable=MPU_ACCESS_NOT_BUFFERABLE`。3) 调用 `HAL_MPU_ConfigRegion()` 并确保缓冲区地址对齐。注意:若使用 `SCB_EnableDCache()`,需在 MPU 配置后调用,且 DMA 描述符也建议放在 Non-Cacheable 区。这样 CPU 和 DMA 访问一致,彻底避免错位。
mcuku 阿沐 · 2026-10-04