在STM32F4系列中,DMA与双缓冲ADC配合时,缓存一致性问题主要源于CPU和DMA对同一内存区域的访问不同步。精确规避的关键在于:1)使用DMA的循环模式并配置双缓冲(DBUF),确保DMA在缓冲区A和B之间切换时,CPU只处理非活动缓冲区;2)在DMA中断回调中,通过检查DMA_SxCR的CT位(当前目标)判断哪个缓冲区正在被DMA写入,CPU只读取另一个缓冲区,避免直接访问DMA正在写入的内存;3)若使用D-Cache(如F4系列部分型号),需在DMA配置前调用SCB_InvalidateDCache_by_Addr()使缓存行无效,并在CPU读取前再次无效化,确保数据从内存读取;4)推荐将缓冲区定义为volatile并放置在DMA可访问的SRAM(如SRAM1),避免使用CCM RAM(无法被DMA访问)。实操建议:使用HAL库的HAL_ADC_Start_DMA()配合ADC_DMAConvCplt回调,在回调中根据CT位切换处理逻辑,并确保缓冲区大小对齐到缓存行(32字节)。
mcuku 阿沐 · 2026-08-27