这是典型的Cache一致性问题:DMA直接写内存,而CPU可能从D-Cache读到旧数据,或Cache回写覆盖DMA新数据。彻底解决要分两步。第一,把DMA缓冲区放到MPU配置为Non-Cacheable的区域,例如0x30000000起的SRAM区,用MPU_Region设置TEX=1、C=0、B=0(Normal, Non-cacheable),并确保该区域不与其它Cacheable区重叠。第二,若必须用Cacheable内存,则采用Write-Through而非Write-Back,并在DMA接收前调用SCB_InvalidateDCache_by_Addr()无效化对应行,注意地址和长度按32字节对齐,且无效化前确保CPU没有未回写数据。推荐做法:为DMA单独划一段Non-Cacheable RAM,DMA描述符和缓冲区都放这里,CPU访问时性能损失可接受,且无需每次手动维护Cache,最稳定。配置后记得调用MPU_Enable和SCB_EnableDCache,顺序不能反。
mcuku 阿沐 · 2026-10-08