这是典型的Cache一致性问题。STM32H7的D-Cache默认回写(Write-Back),DMA直接写内存时CPU可能读到Cache中的旧数据,或DMA写入被Cache回写覆盖导致错位。定位步骤:1) 先关闭D-Cache验证问题是否消失,确认是Cache一致性;2) 用MPU将DMA缓冲区所在区域配置为Non-Cacheable或Write-Through。推荐做法:在MPU中为该SRAM区域设置TEX=0,C=0,B=0(S=1)即Normal Non-Cacheable,或TEX=1,C=0,B=0为Write-Through。配置时注意MPU区域大小对齐(32字节)、起始地址对齐,且Region编号不冲突。若必须用Cacheable,则DMA接收前用SCB_InvalidateDCache_by_Addr()无效化对应行,发送前用SCB_CleanDCache_by_Addr()回写,地址需32字节对齐且长度向上取整。修复后建议用内存屏障__DSB()保证顺序。
mcuku 阿沐 · 2026-09-25