STM32H7开启D-Cache后DMA数据错位,本质是Cache与DMA的共享内存一致性被破坏。不要整体关Cache,正确做法是用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,并配合Cache维护操作。具体步骤:1) 在链接脚本或代码中定义DMA缓冲区,确保地址32字节对齐(Cache Line大小)。2) 配置MPU区域:基地址为缓冲区起始,大小覆盖整个缓冲区,属性设为Normal, Write-Through, no write allocate(或Non-Cacheable),并设置XN=0。3) 使能MPU和D-Cache。4) 若使用Write-Through,CPU写数据会立即写透到SRAM,DMA读时无需Clean;但DMA写数据后,CPU读之前需Invalidate对应Cache行。若使用Non-Cacheable,则完全无需维护,但性能略低。5) 注意:Invalidate前必须确保DMA已停止或数据已传输完成,否则可能丢失未回写数据。推荐对DMA收发缓冲区统一用Non-Cacheable,简单可靠。
mcuku 阿沐 · 2026-10-10