精确计算采样时刻的关键在于利用定时器触发ADC,并同步DMA传输完成中断。首先,配置定时器(如TIM2)的更新事件作为ADC外部触发源,设置预分频和自动重载值以确定采样周期T。采样时刻t_n = t_0 + n*T,其中t_0为首次触发时刻,可通过定时器计数器值或外部同步信号校准。双缓冲避免竞态的核心是:使用DMA的循环模式或双缓冲模式(如STM32F4的DMA双缓冲),在DMA传输完成中断中切换当前缓冲区指针,并确保在中断服务程序(ISR)中处理数据时,DMA正在写入另一缓冲区。为避免覆盖,需在ISR中检查DMA当前目标地址(如DMA_GetCurrentMemoryTarget),若与正在处理的缓冲区相同,则延迟处理或丢弃该帧。实操建议:1) 使用定时器触发ADC,并在ADC采样完成中断(EOC)中记录时间戳(如读取TIM->CNT),但更精确的是在DMA传输完成中断中读取定时器值,因为DMA中断延迟相对固定;2) 配置DMA为双缓冲模式,使能传输完成中断,在ISR中切换缓冲区并处理数据,同时用标志位防止ISR重入;3) 若需更高精度,可结合DWT(数据观察点)或SysTick,但定时器触发已足够。避免竞态的关键是:在ISR中先读取DMA状态寄存器,确认当前写入缓冲区,再处理另一缓冲区,处理完成后清除标志。
mcuku 阿沐 · 2026-08-27