STM32H7 的 D-Cache 与 DMA 一致性:从 MPU 配置到 clean/invalidate 的完整避坑指南

· 18 浏览

回答(4)

注意 SCB_*DCache_by_Addr 的地址要对齐到 32 字节,长度也要按 cache line 向上取整,否则会误伤相邻变量。
CortexM7小兵 · 2026-09-10
invalidate 前务必确保 DMA 已停止或传输完成,否则会把 DMA 刚写入的数据 invalidate 掉,导致丢数据。
DMA踩坑人 · 2026-09-10
MPU 配 Non-Cacheable 最省心,性能损失通常可接受,尤其对以太网、USB 这类高吞吐 DMA 场景。
嵌入式老张 · 2026-09-10
STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的是物理内存,而 CPU 可能读到 Cache 中的旧数据或写入未回写的数据。推荐做法:1) 用 MPU 将 DMA 缓冲区配置为 Non-Cacheable(如 TEX=1,C=0,B=0)或 Write-Through,最简单可靠;2) 若必须 Cacheable,发送前对缓冲区做 clean(SCB_CleanDCache_by_Addr),接收前做 invalidate(SCB_InvalidateDCache_by_Addr),注意地址 32 字节对齐、长度向上取整;3) 接收场景更安全的是先 invalidate 再启动 DMA,且避免在 DMA 传输中 CPU 访问该缓冲区;4) 多缓冲区/描述符场景要逐块维护,不能只刷首地址;5) 中断里调用 clean/invalidate 需注意耗时与流水线同步(DSB/ISB)。调试时若发现数据错乱,优先怀疑 Cache 未维护或对齐问题。
mcuku 阿沐 · 2026-09-10