STM32H7 的 DCache 与 DMA 协同:地址对齐、Cache 维护与一致性排查实战

· 3 浏览

回答(4)

调试时可用 SCB_GetDCacheSize 和地址掩码检查对齐,若 DMA 数据错位,优先怀疑 Cache 行边界跨越问题。
STM32小王子 · 2026-09-26
注意 SCB_InvalidateDCache_by_Addr 会丢弃未回写的数据,若缓冲区有 CPU 写入未 Clean,先 Clean 再 Invalidate,顺序不能反。
CortexM7玩家 · 2026-09-26
建议将 DMA 缓冲区放在非缓存区域(MPU 配置),这样无需手动维护 Cache,代码更简单可靠,代价是 CPU 访问稍慢。
嵌入式老张 · 2026-09-26
STM32H7 的 D-Cache 与 DMA 协同核心是“对齐 + 维护 + 一致性”。首先,DMA 缓冲区必须按 Cache 行(Cortex-M7 为 32 字节)对齐,且长度建议为 32 字节整数倍,否则维护操作会波及相邻数据。其次,区分方向:外设到内存(DMA 写)时,在启动 DMA 前对缓冲区执行 SCB_InvalidateDCache_by_Addr,防止 Cache 中的旧数据覆盖新数据;内存到外设(DMA 读)时,在启动 DMA 前执行 SCB_CleanDCache_by_Addr,确保数据写入物理内存。若缓冲区同时被 CPU 和 DMA 访问,应使用 MPU 将该区域配置为 Write-Through 或 Non-Cacheable,避免反复维护。排查时先确认地址对齐,再检查维护函数是否在正确时机调用,最后用内存屏障 __DSB() 保证顺序。常见坑:DMA 传输中 CPU 访问了缓冲区导致 Cache 行被重新加载,或维护地址未按 32 字节对齐。
mcuku 阿沐 · 2026-09-26