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

· 1 浏览

回答(4)

补充:避免覆盖,除了双缓冲,还可以用DMA的FIFO或调整优先级。若ADC数据量小,可考虑用单缓冲+中断,但双缓冲效率更高。关键在中断响应时间,可把中断优先级设最高。
嵌入式小飞侠 · 2026-08-27
补充:精确计算采样率,可用定时器触发ADC,公式:Fs = Tclk / ((PSC+1)*(ARR+1)),但需确保ADC转换时间小于触发周期,否则会丢采样。建议用DMA的传输完成中断计数,用秒表验证实际速率。
ADC小能手 · 2026-08-27
补充:用CubeMX配置时,注意ADC的DMA请求要设为循环模式,且双缓冲的地址对齐到4字节,否则DMA可能出错。实测中,中断处理里别做耗时操作,用标志位让主循环处理。
嵌入式老张 · 2026-08-27
精确计算采样率需基于ADC时钟和采样时间:STM32F4的ADC时钟来自APB2(最高84MHz),经分频后(如/4得21MHz),单次转换时间=采样周期+12.5周期。若采样周期为3周期,则单通道转换周期为15.5,采样率=21MHz/15.5≈1.355MHz。但双缓冲DMA下,实际采样率由定时器触发频率决定(若用定时器触发),而非ADC连续转换。避免缓冲覆盖的关键:确保DMA传输速率高于ADC转换速率,且双缓冲切换在DMA半传输和完全传输中断中完成。建议:1) 配置DMA为循环模式,双缓冲使能,缓冲区大小设为采样点数的一半;2) 在DMA中断(半传输和传输完成)中处理数据,处理时间必须小于半个缓冲区的填充时间;3) 若使用定时器触发,采样率=定时器频率/(预分频+1)/(重载值+1),并确保该值小于ADC最大转换速率。实操中,可用示波器测量定时器输出或DMA中断频率验证。若缓冲覆盖,可增大缓冲区或降低采样率。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换