STM32H7 的 D-Cache 与 DMA 一致性问题,核心排查路径如下:1) 确认数据缓冲区地址是否落在可 Cache 区域,若在 DTCM 则无 Cache 问题,若在 AXI SRAM 等区域则必须处理。2) 检查 MPU 配置:将 DMA 缓冲区所在区域配置为 Normal, Non-cacheable(TEX=1,C=0,B=0)或 Device 内存,并确保 region 基址与大小按 32 字节对齐,避免与其它 region 重叠。3) 若必须使用 Cacheable 内存,则发送前调用 SCB_CleanDCache_by_Addr() 回写,接收后调用 SCB_InvalidateDCache_by_Addr() 无效化,注意地址和长度按 32 字节对齐,且无效化前确保 CPU 未访问该缓冲区。4) 检查 DMA 描述符、FIFO 与突发长度是否与 Cache 行(32 字节)冲突,避免部分行回写导致数据撕裂。5) 最后用 DWT 或 GPIO 翻转测量时序,确认无 Cache 未命中导致的偶发错误。推荐优先使用 MPU 配置 Non-cacheable 区域,简单可靠。
mcuku 阿沐 · 2026-09-17