在嵌入式系统中,对外部信号的时序特性(如周期、脉冲宽度)进行精准测量是众多应用的核心需求,从电机转速检测、红外遥控信号解码,到超声波测距、通信协议同步,都需要实时获取外部信号的时间维度信息。而定时器的输入捕获模式,正是通过硬件级别的信号检测与时间锁存,实现对外部信号边沿(上升沿、下降沿或双边沿)的精准捕捉,为后续时序分析提供高可靠性的时间数据,其底层逻辑围绕 “信号触发 - 硬件锁存 - 时间计算” 展开,是嵌入式系统中实现高精度时序测量的关键技术之一。
输入捕获模式的本质,是利用定时器的计数功能与外部引脚的信号检测能力,将外部信号的特定边沿与定时器的当前计数值进行 “绑定”—— 当外部信号出现预设的边沿(如上升沿)时,硬件电路会立即将定时器的当前计数值锁存到专用的捕获寄存器中,同时可触发中断通知 CPU 读取该值。这种硬件级别的锁存机制,避免了软件查询方式带来的延迟误差,确保捕获到的计数值能真实反映信号边沿发生的时刻,从而为时间差计算提供精准依据。从硬件架构来看,支持输入捕获模式的定时器通常包含外部信号输入引脚(如 TIMx_CH1~CH4)、边沿检测电路、捕获寄存器(如 TIMx_CCR1~CCR4)、计数器(TIMx_CNT)以及中断生成逻辑:外部信号通过输入引脚进入后,首先经过边沿检测电路,该电路可通过寄存器配置选择检测上升沿、下降沿或双边沿;当检测到预设边沿时,触发信号会直接控制捕获逻辑,将计数器当前值 “冻结” 并写入捕获寄存器,整个过程无需 CPU 干预,响应延迟仅为几个时钟周期,远低于软件层面的信号处理速度。
要理解输入捕获模式的完整工作流程,需结合具体的时序测量场景展开。以测量外部信号的脉冲宽度(高电平持续时间)为例,其底层逻辑可分为三个关键阶段:首先是模式配置阶段,CPU 需通过寄存器配置定时器的工作参数 —— 设定定时器的计数时钟频率(如由 APB 总线时钟分频得到),确保计数精度满足测量需求;配置输入捕获引脚对应的通道(如 TIM2_CH1),并选择捕获边沿为 “上升沿”;同时使能捕获中断,以便信号边沿到来时 CPU 能及时读取捕获值。当配置完成后,定时器开始自由计数,计数器数值从 0 开始随时钟周期递增(或递减,具体取决于计数模式)。
第二阶段是上升沿捕获阶段,当外部信号从低电平变为高电平时,边沿检测电路检测到上升沿,立即触发捕获操作,将此时计数器的当前值(记为 CNT1)锁存到捕获寄存器 TIMx_CCR1 中,同时生成捕获中断。CPU 响应中断后,读取 CNT1 的值并存储,随后通过寄存器重新配置该通道的捕获边沿为 “下降沿”,为后续捕获信号的下降沿做准备 —— 这一步的核心是通过切换捕获边沿,实现对同一信号高电平起始与结束时刻的分别捕获。
第三阶段是下降沿捕获与时间计算阶段,当外部信号从高电平变为低电平时,边沿检测电路检测到下降沿,再次触发捕获操作,将此时计数器的当前值(记为 CNT2)锁存到捕获寄存器中,并再次生成中断。CPU 响应中断后读取 CNT2 的值,此时需判断计数器在两次捕获之间是否发生 “溢出”—— 若 CNT2 大于 CNT1,说明计数器未溢出,脉冲宽度对应的计数差值为 ΔCNT=CNT2 - CNT1;若 CNT2 小于 CNT1,说明计数器在两次捕获之间已溢出(即数值从最大值重置为 0 后继续计数),此时需通过溢出中断记录的溢出次数(记为 N)计算总差值,即 ΔCNT=(N× 计数器最大值) + CNT2 - CNT1。最后,结合定时器的计数周期(T=1 / 计数频率),即可计算出脉冲宽度的实际时间:脉冲宽度 =ΔCNT×T。例如,若定时器计数频率为 1MHz(计数周期 1μs),ΔCNT=1000,则脉冲宽度为 1000×1μs=1ms。
在实际应用中,输入捕获模式的底层逻辑还需处理一些关键细节,以确保测量精度与可靠性。首先是计数器溢出问题,由于定时器计数器的位数有限(如 16 位定时器最大值为 65535),当测量的信号周期或脉冲宽度超过计数器的最大计数值对应的时间时,必然会发生溢出,若未及时处理会导致计数差值计算错误。因此,需同时使能定时器的溢出中断,在中断服务函数中记录溢出次数,确保两次捕获之间的总计数差值能准确反映实际时间。其次是信号噪声滤波问题,外部信号可能因干扰产生毛刺(如短时间的虚假边沿),若被误检测为有效边沿,会导致捕获值错误。为此,部分定时器外设集成了 “输入滤波” 功能,可通过配置滤波系数,让边沿检测电路仅识别持续时间超过一定时钟周期的边沿,过滤掉高频毛刺,例如配置滤波系数为 8,意味着只有当外部信号的边沿持续 8 个时钟周期以上时,才会被判定为有效边沿,从而提升捕获的抗干扰能力。
此外,输入捕获模式还支持 “双边沿捕获” 与 “多通道同步捕获” 等扩展功能,进一步丰富其应用场景。双边沿捕获模式下,无需软件切换边沿,硬件可自动捕获信号的上升沿与下降沿,并分别锁存对应的计数值,适用于需要快速测量信号周期(一次上升沿与一次下降沿的时间差为半周期)的场景;多通道同步捕获则利用定时器的多个输入通道,同时捕获多个外部信号的边沿,例如在电机控制中,通过两个通道分别捕获电机编码器的 A、B 相脉冲,结合输入捕获值计算电机的转速与转向,其底层逻辑是通过硬件同步确保两个通道的捕获时刻具有严格的时间关联性,避免软件延迟导致的相位偏差。
从本质来看,输入捕获模式的底层逻辑是 “硬件实时响应” 与 “软件精准计算” 的协同 —— 通过硬件电路实现对外部信号边沿的无延迟捕获,将时间信息转化为计数器的数值,再通过软件处理溢出、计算差值,最终还原为实际的时间数据。这种机制既发挥了硬件的高速响应优势,又借助软件的灵活性解决了计数溢出、噪声过滤等问题,使其在需要高精度时序测量的嵌入式场景中不可或缺。无论是工业领域的转速监测、消费电子的遥控解码,还是汽车电子的传感器信号处理,输入捕获模式都以其高可靠性与低 CPU 占用率,成为连接外部信号与嵌入式系统的关键桥梁,深刻体现了嵌入式技术中 “硬件为基、软件赋能” 的核心思想。