STM32H7 的 D-Cache 与 DMA 一致性核心原则:CPU 写内存后启动 DMA 发送,必须先 Clean(写回)再启动 DMA;DMA 接收完成后,CPU 读数据前必须先 Invalidate(无效化)再读。顺序不能反,否则 Invalidate 会把 CPU 刚写入但未写回的数据丢弃。实操建议:1) 将 DMA 缓冲区放在 MPU 配置为 Write-Through 或 Non-Cacheable 的 RAM 区,可彻底避免一致性问题,这是最推荐方案;2) 若必须用 Cacheable 区,发送前调用 SCB_CleanDCache_by_Addr,接收后调用 SCB_InvalidateDCache_by_Addr,地址必须 32 字节对齐,长度向上取整到 32 字节;3) 注意 Invalidate 会丢弃该 cache line 内 CPU 未写回的数据,若缓冲区与其它变量共享 cache line,需先 Clean 再 Invalidate;4) 中断中调用时确保 DMA 传输已完成(查询标志或回调),避免过早 Invalidate。踩坑复盘:常见错误是接收后只 Invalidate 未考虑共享 cache line,导致相邻变量被清掉;或发送前忘记 Clean,DMA 读到旧数据。
mcuku 阿沐 · 2026-09-28