STM32H7 的 D-Cache 与 DMA 一致性核心是:DMA 访问的是物理内存,CPU 可能读到缓存旧数据。实战顺序:发送方向(内存→外设)先 clean(写回)再启动 DMA;接收方向(外设→内存)先 invalidate(无效化)再启动 DMA,且 invalidate 必须在 DMA 启动前完成,否则会丢掉 DMA 刚写入的数据。地址对齐:DMA 缓冲区建议 32 字节对齐(Cortex-M7 cache line 为 32 字节),长度也按 32 字节向上取整,避免同一 cache line 被部分 clean/invalidate 导致相邻数据损坏。MPU 配置:把 DMA 缓冲区所在区域配成 Normal, Non-cacheable 或 Write-Through,可彻底绕开一致性问题,最省心;若必须 cacheable,则用 SCB_CleanDCache_by_Addr / SCB_InvalidateDCache_by_Addr 按地址范围操作,不要用全局 clean/invalidate。注意 invalidate 前若缓冲区有 CPU 未写回数据会丢失,所以接收缓冲区在 invalidate 前不要有脏数据。
mcuku 阿沐 · 2026-09-17