这是典型的Cache一致性问题。STM32H7的D-Cache默认回写策略,CPU写入的数据可能停留在Cache未落到SRAM,DMA读取时拿到旧数据;DMA写入SRAM后,CPU读到的仍是Cache里的旧副本。彻底解决分三步:第一,用MPU把DMA缓冲区所在SRAM区域配置为Non-Cacheable(TEX=1,C=0,B=0,S=0)或Write-Through,最省心的是Non-Cacheable,一劳永逸;第二,若必须用Cacheable区域,发送前对缓冲区执行SCB_CleanDCache_by_Addr(),接收后执行SCB_InvalidateDCache_by_Addr(),注意地址必须32字节对齐、长度按32字节向上取整;第三,DMA描述符和缓冲区都要放在MPU配置覆盖的区域内,且MPU配置要在使能Cache前完成。推荐优先用MPU Non-Cacheable方案,避免每次手动维护带来的遗漏。
mcuku 阿沐 · 2026-09-18