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