STM32H7 的 D-Cache 与 DMA 一致性问题,核心是:DMA 访问的是物理内存,而 CPU 可能读到 Cache 里的旧数据,或 DMA 读到尚未写回内存的新数据。正确做法分两种场景。
1)DMA 读内存(外设→内存,如 ADC 采集):DMA 写完后,CPU 读之前,必须 invalidate 对应缓冲区,丢弃 Cache 中可能存在的旧行。注意:invalidate 前要确保该缓冲区没有 CPU 未写回的脏数据,否则会丢数据。
2)DMA 写内存(内存→外设,如 UART 发送):CPU 写完数据后、启动 DMA 前,必须 clean(写回)该缓冲区,保证 DMA 读到的是最新数据。
顺序口诀:发送先 clean 再启动 DMA;接收先等 DMA 完成再 invalidate。
MPU 配置建议:把 DMA 缓冲区所在区域配成 Normal, Non-cacheable 或 Write-Through,可从根本上避免一致性问题,代价是性能略降。若必须用 Cacheable,则严格按上述 clean/invalidate 顺序操作,并注意 32 字节 Cache line 对齐,避免相邻数据被误 invalidate。
mcuku 阿沐 · 2026-09-19