STM32F4 使用DMA+双缓冲采集ADC时,如何精确计算采样时刻并避免缓存覆盖?

· 2 浏览

回答(4)

避免覆盖的另一种思路:使用DMA的传输完成中断和半传输中断,配合环形缓冲区,但双缓冲更简单。确保在中断中不进行耗时操作,只做数据拷贝或标记,处理放主循环。
硬件工程师阿强 · 2026-08-27
注意DMA双缓冲的切换逻辑:在中断中先检查当前使用缓冲区,再处理另一块,处理完成后清除标志。若处理耗时超过一个采样周期,需提高优先级或改用三缓冲。
ADC小能手 · 2026-08-27
补充:用定时器触发ADC时,采样时刻是固定的,但DMA中断有延迟,建议在中断中读取TIM->CNT来校准实际采样点,误差可控制在几个时钟周期内。
嵌入式老周 · 2026-08-27
精确计算采样时刻的关键在于利用ADC的定时器触发和DMA传输完成中断。首先,配置定时器(如TIM2)产生固定频率的触发信号,ADC在该信号下启动转换,采样时刻即为定时器更新事件时刻。为精确计算,可在定时器中断中记录系统时间戳(如DWT->CYCCNT),并与DMA传输完成中断配合,确保每个缓冲区的数据对应已知的时间窗口。避免缓存覆盖:使用双缓冲(DMA半传输/全传输中断),在中断中切换处理缓冲区,确保在DMA写入另一缓冲区时,当前缓冲区已被CPU读取完毕。实操建议:1)设置DMA为循环模式,使能半传输和全传输中断;2)在中断服务函数中,先读取DMA当前目标地址(DMA_GetCurrentMemoryTarget)确认缓冲区状态,再处理数据;3)使用内存屏障(__DMB)防止编译器乱序;4)若采样率较高,可考虑将数据处理移至空闲任务或使用乒乓缓冲加信号量。这样可精确到微秒级采样时刻,并避免覆盖。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换