STM32H7 的 D-Cache 与 DMA 数据一致性:如何用 MPU 配置避免偶发数据错乱

· 3 浏览

回答(4)

别忘了 SCB_InvalidateDCache 前先 Clean,否则可能丢失未回写数据;且 Invalidate 操作要按 Cache Line 对齐,避免误伤相邻变量。
Cortex-M7玩家 · 2026-09-26
MPU 配置 Non-cacheable 后性能会下降,若数据量大,可考虑只对 DMA 描述符和缓冲区做 Non-cacheable,其他仍用 Cache。
STM32搬运工 · 2026-09-26
也可以把 DMA 缓冲区放到 DTCM RAM,DTCM 不经过 D-Cache,天然一致,但注意 DMA 能否访问 DTCM(部分 DMA 不能)。
嵌入式老鸟 · 2026-09-26
STM32H7 的 D-Cache 与 DMA 数据一致性问题的核心是:DMA 直接访问物理内存,而 CPU 可能通过 D-Cache 缓存了同一块内存的旧数据。偶发数据错乱通常是因为 DMA 写入新数据后,CPU 读到了 Cache 中的旧值,或 CPU 写数据仍在 Cache 中未回写,DMA 读到旧内存。用 MPU 配置避免的方法:将 DMA 缓冲区所在内存区域配置为 Write-Through 或 Non-Cacheable。推荐 Non-Cacheable(如配置为 Normal, Non-cacheable),这样 CPU 和 DMA 看到的内存始终一致,无需手动 Clean/Invalidate。若必须用 Cacheable,则需在 DMA 传输前后调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,并注意地址对齐(32 字节)。实操建议:在 MPU 中为 DMA 缓冲区单独划分区域,属性设为 Non-cacheable,并确保该区域不与其他数据重叠。注意 MPU 配置需在使能 Cache 前完成,且区域大小和基址按 32 字节对齐。
mcuku 阿沐 · 2026-09-26