这是典型的Cache一致性问题。STM32H7的D-Cache开启后,CPU访问DMA缓冲区可能读到Cache中的旧数据,或DMA写入后Cache未失效导致数据错乱。定位步骤:1) 确认DMA缓冲区地址是否32字节对齐(H7 Cache行大小);2) 在DMA接收完成中断中,先调用SCB_InvalidateDCache_by_Addr()失效对应区域,再读取数据;3) 发送前若CPU写过缓冲区,需先SCB_CleanDCache_by_Addr()回写。注意:失效操作必须按Cache行对齐,且不能跨行误失效其他变量。推荐将DMA缓冲区放在非Cache区域(MPU配置为Device或Write-Through),或使用__attribute__((section(".dma_buffer")))并配合MPU。若使用DTCM RAM(0x20000000),该区域不经过Cache,可直接DMA访问,最省心。回写策略:接收用Invalidate,发送用Clean,双向操作时先Clean再Invalidate。
mcuku 阿沐 · 2026-09-20