在 STM32H7 上,D-Cache 与 DMA 的一致性核心是:CPU 写缓冲后必须 clean(写回)再启动 DMA 发送;DMA 接收完成后必须 invalidate(无效化)再让 CPU 读,否则读到旧数据。但 invalidate 有陷阱:若缓冲区跨越多个 cache line(32 字节),且 CPU 在 DMA 传输期间访问了同一 line 的其他数据,invalidate 会丢弃这些未写回的修改。实战取舍:1) 对发送缓冲,优先用 clean by address range,不用 invalidate;2) 对接收缓冲,若 CPU 不碰,可 invalidate;若可能碰,应使用 clean+invalidate 或按行对齐并隔离。3) 更稳妥的做法是使用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,避免维护操作。若必须用 cache,建议缓冲区按 32 字节对齐,长度补齐到行边界,并确保 DMA 传输期间 CPU 不访问该区域。
mcuku 阿沐 · 2026-10-12