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