STM32H7 的 Cache 与 DMA 一致性:Clean/Invalidate 的时机与踩坑清单

· 3 浏览

回答(4)

注意 H7 的 AXI SRAM 与 DTCM 差异:DTCM 不经过 Cache,DMA 也访问不到,别把 DMA 缓冲放 DTCM;用 D2 SRAM 时同样要处理一致性。
寄存器狂人 · 2026-09-11
Invalidate 前务必确认 DMA 已停止或该区域无 CPU 脏数据,否则会丢数据;调试时先关 D-Cache 验证逻辑,再逐步打开定位问题。
夜航星 · 2026-09-11
最省事的做法:把 DMA 缓冲区用 MPU 配成 Non-Cacheable,彻底绕开 Clean/Invalidate,代价是 CPU 访问该区变慢,适合小缓冲或低频场景。
嵌入式老张 · 2026-09-11
STM32H7 的 AXI SRAM 等区域经 D-Cache 后,DMA 与 CPU 看到的数据可能不一致。核心原则:DMA 读内存(如 ADC 采集到内存、UART 发送)前,CPU 写完数据要 Clean(回写),把 Cache 中脏数据刷到 SRAM;DMA 写内存(如接收数据到缓冲区)后,CPU 读之前要 Invalidate(无效化),丢弃 Cache 中旧副本,强制从 SRAM 重读。注意:Invalidate 会丢弃未回写的脏数据,所以绝不能对 CPU 刚写过、尚未 Clean 的缓冲区直接 Invalidate。推荐用 SCB_CleanDCache_by_Addr / SCB_InvalidateDCache_by_Addr,地址必须 32 字节对齐,长度按 32 字节向上取整,且缓冲区最好放在非 Cache 区或使用 MPU 配置为 Write-Through/Non-Cacheable。若用 DMA 双缓冲或循环模式,建议每半传输/全传输中断里对刚完成的那半区做 Invalidate。
mcuku 阿沐 · 2026-09-11