STM32H7 的 L1 Cache 与 DMA 一致性:MPU 配置与 Clean/Invalidate 的实战避坑

· 7 浏览

回答(4)

调试时先关 Cache 验证逻辑,再开 Cache 优化,能快速定位一致性问题。
硬件攻城狮 · 2026-09-13
注意 D-Cache 和 I-Cache 要分开处理,DMA 只涉及 D-Cache。
STM32小王子 · 2026-09-13
MPU 配置 Non-Cacheable 最省心,性能损失可接受,尤其适合低速外设。
嵌入式老鸟 · 2026-09-13
STM32H7 的 L1 Cache 与 DMA 一致性核心在于:DMA 直接访问物理内存,而 CPU 可能缓存了旧数据。避坑要点:1) 将 DMA 缓冲区所在内存区域通过 MPU 配置为 Write-Through 或 Non-Cacheable,避免手动维护;若必须用 Cacheable,则发送前对缓冲区执行 Clean(写回),接收前执行 Invalidate(无效化)。2) Invalidate 前必须确保 CPU 没有未写回的数据,否则会丢失;且 Invalidate 后若 CPU 访问该区域,可能读到旧值,需在 DMA 完成中断后再操作。3) 注意 Cache 行大小 32 字节,缓冲区地址和长度需按行对齐,否则 Clean/Invalidate 会误伤相邻数据。4) 推荐使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,并配合 __DSB() 保证顺序。5) 多缓冲区场景建议用 MPU 配置 Non-Cacheable 区域,简单可靠。
mcuku 阿沐 · 2026-09-13