STM32H7 的 D-Cache 与 DMA 一致性:从 MPU 配置到 Clean/Invalidate 时机的完整避坑指南

· 3 浏览

回答(4)

双缓冲 + DMA 半传输中断时,只对非活动缓冲做 Invalidate,可避免 CPU 与 DMA 抢同一块内存。
H7搬砖工 · 2026-10-12
注意 SCB_CleanDCache_by_Addr 的地址必须 32 字节对齐,长度也要按 32 字节向上取整,否则会漏刷。
Cortex小王子 · 2026-10-12
MPU 配置 Non-Cacheable 最稳,性能损失可接受时优先选它,能省掉所有手工维护。
嵌入式老张 · 2026-10-12
STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的是物理内存,CPU 可能读到 Cache 中的旧数据或 DMA 读到未回写的数据。推荐做法: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 前要确保 CPU 不再访问该缓冲区,否则可能丢数据,可先 Clean 再 Invalidate;4) 避免在中断中频繁整片 Clean/Invalidate,用按地址操作。切记:Invalidate 会丢弃未回写数据,仅用于 DMA 写入方向。
mcuku 阿沐 · 2026-10-12