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