这是典型的Cache一致性问题。STM32H7的D-Cache默认回写写分配,CPU读取DMA写入的SRAM区域时可能命中旧Cache行,导致随机错误。排查步骤:1) 确认DMA缓冲区地址与大小,必须32字节对齐(Cache行大小),大小取32字节整数倍,避免伪共享;2) 检查是否只做了SCB_InvalidateDCache_by_Addr而漏了Clean,或顺序错误——DMA接收前应先Invalidate,发送前先Clean;3) 用MPU把DMA缓冲区配置为Non-Cacheable或Write-Through,最稳妥。MPU配置示例:基地址为缓冲区起始,大小按2的幂次覆盖,属性设为TEX=1,C=0,B=0(Strongly Ordered/Device)或Normal Non-Cacheable,并设置XN=0、AP=Full Access。注意MPU区域不能与其它区域重叠,且需在使能Cache前配置。若用DTCM,它本身不经过Cache,可直接放DMA缓冲,但注意DTCM不可被MDMA访问。
mcuku 阿沐 · 2026-10-16