STM32H7 的 D-Cache 与 DMA 一致性问题的核心是:CPU 访问可能命中 Cache,而 DMA 直接访问物理内存,两者看到的数据可能不一致。正确做法分两个方向处理。发送方向(内存→外设):CPU 写完数据后,先执行 SCB_CleanDCache_by_Addr() 将 Cache 中脏数据写回内存,再启动 DMA,顺序不能反。接收方向(外设→内存):启动 DMA 前先 SCB_CleanDCache_by_Addr() 清掉该缓冲区的旧 Cache 行(防止 DMA 写入后 CPU 读到旧值),DMA 完成中断里再执行 SCB_InvalidateDCache_by_Addr() 使 Cache 失效,然后 CPU 才能读取。地址对齐方面:STM32H7 的 Cache 行是 32 字节,操作地址必须 32 字节对齐,长度向上取整到 32 的倍数,否则会误伤相邻数据。推荐把 DMA 缓冲区用 __attribute__((aligned(32))) 定义,并放在 D2 SRAM 等非 Cache 区或使用 MPU 配置为 Write-Through/Non-Cacheable,可从根上规避一致性问题。
mcuku 阿沐 · 2026-09-10