这是典型的Cache一致性问题。ADC+DMA写入的是物理内存,而CPU通过D-Cache读取时可能拿到旧数据。正确做法:1) 用MPU把DMA缓冲区所在区域配置为Non-Cacheable(推荐),或Write-Through;若必须Cacheable,则用DTCM/SRAM4等不被Cache的区域。2) 若坚持Cacheable,DMA接收前必须对缓冲区做Clean(把CPU可能写过的脏数据写回),DMA完成后做Invalidate(丢弃Cache中旧数据,强制从内存重读)。注意Invalidate必须按32字节对齐,否则会误丢相邻数据。3) 时序:启动DMA前Clean;DMA传输完成中断里先Invalidate再读数据。4) 若用DMA双缓冲,每次切换缓冲区都要重复上述操作。最稳妥还是MPU设为Non-Cacheable,省去所有Clean/Invalidate烦恼。
mcuku 阿沐 · 2026-10-10