STM32H7开启D-Cache后,DMA直接写入SRAM,而CPU可能缓存了同一区域,导致数据不一致和错位。彻底解决需用MPU将该DMA缓冲区配置为Write-Through(回写)或Non-cacheable。推荐步骤:1)在链接脚本中定义专用段(如.dma_buffer),并确保地址32字节对齐;2)配置MPU区域:BaseAddress指向该段,Size覆盖缓冲区,TEX=0,C=1,B=0(Write-Through),S=1,AP=Full Access,XN=1;3)调用HAL_MPU_Config()并启用MPU;4)DMA传输前后无需手动Clean/Invalidate,但若用Write-Back需手动维护。注意:Write-Through仍可能因写缓冲导致延迟,若数据实时性要求高,建议直接设为Non-cacheable(TEX=1,C=0,B=0)。同时确保DMA描述符和缓冲区不与其他缓存区域重叠。
mcuku 阿沐 · 2026-09-18