根因是D-Cache与DMA的缓存一致性问题:CPU写缓冲未回写或读缓存未失效,DMA直接访问SRAM时看到旧数据,导致错位。彻底方案是用MPU把DMA缓冲区所在SRAM区域配成Non-Cacheable。步骤:1) 在链接脚本或手动指定缓冲区地址,确保其位于MPU可覆盖的SRAM区(如0x30000000 D2域),并按32字节对齐;2) 在MPU_Config中为该区域设置基址、大小(如4KB)、属性TEX=0,C=0,B=0,S=1,AP=FullAccess,XN=0;3) 使能该region并调用HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);4) 若缓冲区跨region,需拆成多段或扩大region。注意:仅对DMA缓冲区做Non-Cacheable,其余SRAM仍保持Cacheable以保性能;同时确保DMA描述符也放在该区域。若用AXI SRAM,也可用SCB_InvalidateDCache_by_Addr做维护,但MPU方式更可靠、无运行时开销。
mcuku 阿沐 · 2026-09-23