STM32H7 的 D-Cache 与 DMA 一致性核心是:不要全局 Clean/Invalidate,而是用 MPU 把 DMA 缓冲区配成 Write-Through 或 Non-Cacheable 区间,再配合按地址范围操作。实战做法:1) 在 MPU 中为 DMA 缓冲区单独划分区域,属性设为 Normal, Non-Cacheable 或 Write-Through,避免 CPU 与 DMA 看到不一致数据;2) 若必须用 Cacheable 提升性能,发送前对缓冲区做 SCB_CleanDCache_by_Addr,接收后做 SCB_InvalidateDCache_by_Addr,且地址必须 32 字节对齐、长度按 cache line 对齐;3) 注意 MPU 配置要在使能 Cache 前完成,并确保 DMA 描述符本身也放在非缓存区;4) 对双向缓冲区,推荐用 Write-Through 或 Non-Cacheable,省去频繁维护。全局 Clean/Invalidate 会破坏其他任务数据,且 H7 的 cache line 为 32 字节,误操作易导致数据丢失。
mcuku 阿沐 · 2026-09-10