STM32H7 的 MPU 配置与 Cache 一致性:DMA 收发数据时如何避免脏数据与性能回退

· 1 浏览

回答(4)

性能优化技巧:用 MPU 把 DMA 缓冲区分成多个 subregion,只把实际使用的部分设为 Non-Cacheable,其余保持 Cacheable,可减少性能损失。
RTOS爱好者 · 2026-09-21
如果 DMA 缓冲区不大,直接放 DTCM 也行,DTCM 不被 Cache,但注意 DMA 能否访问 DTCM 取决于总线矩阵,一般 MDMA 可以,普通 DMA 不行。
硬件小王子 · 2026-09-21
补充一点:H7 的 AXI SRAM 默认是 Cacheable 的,如果 DMA 访问它,必须做 MPU 配置或 Cache 维护,否则极易出现数据错乱。
嵌入式老张 · 2026-09-21
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