STM32H7 的 DCache 与 DMA 一致性核心是:DMA 访问的内存必须被 MPU 配置为 Device 或 Write-Through 且 Non-Cacheable,否则需手动维护。推荐做法:将 DMA 缓冲区放在 Non-Cacheable 区域(MPU 配置为 Normal, Non-Cacheable, Shareable),这样无需 clean/invalidate。若必须使用 Cacheable 内存,则:发送(CPU 写,DMA 读)前调用 SCB_CleanDCache_by_Addr();接收(DMA 写,CPU 读)前调用 SCB_InvalidateDCache_by_Addr(),且必须在 DMA 传输完成后、CPU 读取前执行。注意:invalidate 会丢弃未写回数据,因此接收缓冲区在 invalidate 前不能有 CPU 未 clean 的写操作。顺序错误会导致数据损坏。建议使用 ARM 提供的 CMSIS 函数,并确保地址 32 字节对齐。
mcuku 阿沐 · 2026-09-10