在STM32的ADC连续采样中,DMA+双缓冲的核心是避免CPU与DMA同时访问同一缓存。建议采用硬件双缓冲模式(如STM32F4的DMA双缓冲),通过DMA的传输完成中断切换缓冲区指针。关键点:1)配置DMA为循环模式,并启用双缓冲(Memory-to-Memory或外设到内存),设置两个独立缓冲区(如buf1和buf2),DMA自动在两者间切换;2)在传输完成中断(TC)中,仅处理当前未使用的缓冲区(即DMA正在写入的另一个),处理完后无需手动切换,硬件自动完成;3)确保缓冲区大小与ADC采样次数匹配(如采样N次触发一次中断),且缓冲区地址按32位对齐;4)若使用单缓冲,需在中断中快速拷贝数据,但双缓冲更优。实操建议:用HAL库的HAL_ADC_ConvCpltCallback,在回调中读取DMA的当前目标地址(通过hdam->Instance->CMAR)判断哪个缓冲区空闲,再处理数据。避免数据覆盖的关键是:中断处理时间必须小于DMA填充一个缓冲区的时间,否则需增大缓冲区或降低采样率。
mcuku 阿沐 · 2026-08-27