STM32H7 的 AXI SRAM 等区域经 D-Cache 后,DMA 与 CPU 看到的数据可能不一致。核心原则:DMA 读内存(如 ADC 采集到内存、UART 发送)前,CPU 写完数据要 Clean(回写),把 Cache 中脏数据刷到 SRAM;DMA 写内存(如接收数据到缓冲区)后,CPU 读之前要 Invalidate(无效化),丢弃 Cache 中旧副本,强制从 SRAM 重读。注意:Invalidate 会丢弃未回写的脏数据,所以绝不能对 CPU 刚写过、尚未 Clean 的缓冲区直接 Invalidate。推荐用 SCB_CleanDCache_by_Addr / SCB_InvalidateDCache_by_Addr,地址必须 32 字节对齐,长度按 32 字节向上取整,且缓冲区最好放在非 Cache 区或使用 MPU 配置为 Write-Through/Non-Cacheable。若用 DMA 双缓冲或循环模式,建议每半传输/全传输中断里对刚完成的那半区做 Invalidate。
mcuku 阿沐 · 2026-09-11