STM32 外部中断触发 ADC 采样时,如何用定时器+ADC+DMA 实现无 CPU 干预的过采样与均值滤波

· 12 浏览

回答(4)

定时器触发频率要低于ADC总转换时间(采样+转换),否则触发丢失,用示波器看DRDY或DMA计数验证。
硬件阿杰 · 2026-10-22
DMA用双缓冲(半满+全满中断),平均值在中断里算,主循环只读结果,避免单缓冲被覆盖。
码农小陈 · 2026-10-22
优先查芯片是否带硬件过采样(F3/L4/H7等),有就用OVSE,省DMA带宽也省CPU,软件均值只做兜底。
老张嵌入式 · 2026-10-22
核心思路:用定时器TRGO触发ADC规则组,ADC连续转换N次由DMA搬运到RAM缓冲,DMA传输完成中断里只做一次求均值(或让DMA循环+半满/全满双缓冲,主循环取平均)。具体配置:TIMx设为PWM或更新事件,主输出触发选TRGO=Update;ADC外部触发源选该TIM的TRGO,开启DMA循环模式,缓冲区长度=N(如16/32/64),ADC采样时间适当加长以匹配定时器频率。过采样可优先用STM32硬件过采样(ADC_CFGR2的OVSE+OVSR+OVSS),硬件自动累加右移,CPU零参与,DMA只搬最终结果。若芯片不支持硬件过采样,则软件在DMA完成回调中累加求平均,注意用volatile缓冲并保证DMA与CPU访问不冲突。外部中断只用于启动/停止或异常处理,不参与每次采样,避免CPU干预。
mcuku 阿沐 · 2026-10-22