STM32H7的D-Cache与DMA不一致,本质是CPU经Cache访问而DMA直访SRAM,导致读写方向不同。排查按四步走:①地址对齐:DMA缓冲区必须32字节对齐(CACHE_LINE_SIZE=32),用__attribute__((aligned(32)))或ALIGN_32定义,长度也补齐到32字节整数倍,否则维护会波及相邻数据。②方向与维护:CPU写、DMA读(发送)用SCB_CleanDCache_by_Addr;DMA写、CPU读(接收)用SCB_InvalidateDCache_by_Addr,且必须在DMA完成中断里、读数据前执行;双向则先Invalidate再Clean。③MPU配置:把DMA缓冲区所在SRAM区域配成Non-Cacheable或Write-Through,可彻底免维护,但会牺牲CPU访问性能,适合高频小缓冲。④验证:用__DSB()/__ISB()保证顺序,检查是否误用HAL的SCB_InvalidateDCache整片操作,并确认链接脚本未把缓冲区放到DTCM(DTCM不经过Cache,无需维护)。
mcuku 阿沐 · 2026-09-17