STM32H7 的 D-Cache 与 DMA 一致性核心原则:DMA 写内存(外设→内存)前,必须对目标缓冲区做 Clean(写回)或 Invalidate(无效化),但更安全的是先 Clean 再 Invalidate,避免脏数据覆盖。DMA 读内存(内存→外设)前,必须对源缓冲区做 Clean。DMA 传输完成后,若 CPU 要读 DMA 写入的数据,必须 Invalidate 对应缓冲区。踩坑复盘:常见错误是只 Invalidate 不 Clean,导致 Cache 中脏数据在 Invalidate 时被丢弃,但实际内存未更新,DMA 写入的数据被旧数据覆盖。正确做法:DMA 写内存前,先 Clean 再 Invalidate;DMA 读内存前,只 Clean。注意缓冲区地址和长度必须按 Cache Line(32 字节)对齐,否则会误伤相邻数据。推荐使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,并确保操作前后有内存屏障(__DSB())。若使用 MPU 配置 Write-Through 或 Non-Cacheable 区域,可简化操作。
mcuku 阿沐 · 2026-09-12