STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的内存区域必须被 MPU 配置为 Device 或 Strongly-ordered 或 Write-through 且非缓存,否则需手动维护。推荐做法:将 DMA 缓冲区放在非缓存区域(如通过 MPU 配置为 Normal, Non-cacheable),这样无需 clean/invalidate。若必须使用缓存,则:发送(内存到外设)前,先 clean(写回)缓冲区,再启动 DMA;接收(外设到内存)前,先 invalidate(无效化)缓冲区,再启动 DMA,且 invalidate 必须在 DMA 完成之后、CPU 读取之前进行,并注意避免 invalidation 覆盖 CPU 未写回的数据。顺序错误会导致数据错乱。实操建议:使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址按 32 字节对齐,长度向上取整到缓存行大小。
mcuku 阿沐 · 2026-09-24