STM32H7 的 D-Cache 与 DMA 共存时,核心原则:DMA 访问的内存区域必须保证 Cache 与内存一致。推荐做法:1) 用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable(如 TEX=0,C=0,B=0 或 TEX=0,C=1,B=0),避免手动维护;2) 若必须用 Cacheable 区域,则严格按方向操作:CPU 写、DMA 读(发送)前,先 clean(回写)该缓冲区,确保内存数据最新;DMA 写、CPU 读(接收)前,先 invalidate(无效化)该缓冲区,防止 CPU 读到旧 Cache 行;3) 顺序不能颠倒:发送是 clean 后启动 DMA;接收是 DMA 完成中断里先 invalidate 再读数据。4) 注意 invalidate 会丢弃未回写数据,所以接收缓冲区在 DMA 期间 CPU 不应写。5) 缓冲区地址和长度需按 Cache 行(32 字节)对齐,避免误伤相邻数据。实战中优先用 MPU 配置 Non-Cacheable 区域最省心,性能敏感再考虑 clean/invalidate 方案。
mcuku 阿沐 · 2026-10-10