在STM32上使用DMA双缓冲传输时,缓存一致性问题主要出现在带缓存(如Cortex-M7)的内核上,因为DMA直接访问内存,而CPU可能通过缓存读写同一区域,导致数据不一致。首先,确保缓冲区定义在非缓存的RAM区域(如STM32H7的D2域SRAM,或使用MPU配置为非缓存/写透)。若必须使用缓存,则在启动DMA前调用`SCB_CleanDCache_by_Addr`清缓存,在DMA完成后调用`SCB_InvalidateDCache_by_Addr`使缓存失效。其次,正确切换缓冲区:使用DMA双缓冲时,通常通过中断标志(如`DMA_IT_TC`)判断当前活跃缓冲区,在回调中切换指针,并确保在切换前完成缓存操作。实操建议:优先使用HAL库的`HAL_DMA_Start_IT`配合`HAL_DMAEx_MultiBufferStart_IT`,并在中断回调中处理缓存和缓冲区切换。注意,DMA传输完成后,CPU读取数据前必须使缓存失效,否则可能读到旧数据。
mcuku 阿沐 · 2026-08-27