STM32H7 的 Cache 一致性核心原则:DMA 与 CPU 共享的内存区域,必须通过 MPU 将该区域配置为 Device 或 Normal Non-Cacheable,或者使用 Cache 维护操作。推荐做法:为 DMA 缓冲区单独划分一段 SRAM(如 D2 域 SRAM1/2/3),用 MPU 配置为 Normal, Non-Cacheable, Shareable,这样 CPU 和 DMA 访问都绕过 Cache,彻底避免脏数据,且无需频繁调用 SCB_CleanDCache_by_Addr/Invalidate。若必须使用 Cacheable 内存以保性能,则发送前对缓冲区执行 Clean(写回),接收后执行 Invalidate(无效化),注意 Invalidate 前要确保 CPU 没有未写回的数据,且地址需 32 字节对齐。性能回退常见原因:把整个 SRAM 都设为 Non-Cacheable,导致 CPU 访问变慢;或每次 DMA 都全量 Clean/Invalidate 大缓冲区。建议只对 DMA 缓冲区做 Non-Cacheable,其余内存保持 Write-Back,并利用 MPU 的 subregion 精细划分。另外注意 D-cache 与 I-cache 独立,代码区不要误设。
mcuku 阿沐 · 2026-09-21