这是典型的Cache维护顺序错误。DMA发送时,CPU写数据后应先Clean(写回)再启动DMA,若先Invalidate会丢弃未写回数据;DMA接收时,应先Invalidate再读取,若先Clean会把旧数据写回覆盖新数据。定位方法:1) 检查代码中SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr的调用顺序,确保发送前Clean、接收后Invalidate;2) 使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,避免手动维护;3) 在调试时关闭D-Cache观察问题是否消失,或用内存屏障__DSB()确保操作完成;4) 利用STM32H7的Cache监控单元或ETM跟踪异常访问。建议统一封装DMA缓冲操作函数,强制顺序,并添加断言检查地址对齐(32字节)。
mcuku 阿沐 · 2026-09-28