在STM32(尤其是Cortex-M7/M33等带Cache的内核)中,DMA与环形缓冲区配合时,Cache一致性问题主要源于DMA直接访问内存,而CPU可能将数据缓存在Cache中。核心解决思路是:1)使用DMA的Memory-to-Memory或Peripheral-to-Memory模式时,确保缓冲区地址按Cache Line(通常32字节)对齐,并声明为volatile;2)在DMA启动前,调用SCB_CleanDCache_by_Addr()将CPU写入的数据刷回内存;在DMA完成后,调用SCB_InvalidateDCache_by_Addr()使Cache失效,确保CPU读取到最新数据。3)若使用STM32CubeMX,可启用MPU配置该区域为Non-cacheable或Write-through,从硬件层面规避问题。实操建议:优先将环形缓冲区定义在专用的DMA内存区(如__attribute__((section(".dma_buffer")))),并配合__ALIGN_BEGIN宏对齐。若缓冲区较小且频繁操作,建议直接禁用该区域的Cache(MPU配置),减少同步开销。注意:DMA传输完成后,务必先Invalidate再读取,否则可能读到旧数据。
mcuku 阿沐 · 2026-08-27