STM32面试:定时器输入捕获如何测量频率和脉宽?计数器溢出怎么处理?
一、参考回答
定时器输入捕获的基本思路,是让硬件在检测到指定边沿时,把当前计数器CNT的值锁存到捕获比较寄存器CCR,而不是依靠软件进入中断后再读取时间。测频率时,连续捕获两个同类型边沿,得到计数差ΔN,再用定时器计数频率除以ΔN;测脉宽时,分别捕获上升沿和下降沿,计算两次捕获值之差。若计数器计数频率为fCNT,则周期T=ΔN/fCNT,输入频率fIN=fCNT/ΔN。这里的fCNT要根据实际定时器时钟和预分频器计算,不能直接把APB总线时钟当成计数频率。低频信号还要考虑计数器在两个边沿之间溢出;高频信号则要考虑输入滤波、数字滤波延迟和捕获寄存器被覆盖的风险。
二、回答时要讲清楚的关键点
确认定时器内核时钟、APB分频和PSC。部分STM32系列在APB预分频不为1时,定时器时钟可能与PCLK不同;具体倍频关系要查对应芯片参考手册和时钟树。
测周期时捕获连续两个上升沿或连续两个下降沿,使用无符号差值并正确处理ARR回卷;若使用16位计数器,不能忽略计数器溢出。
测PWM高电平脉宽时,要分别锁存上升沿和下降沿,或者使用芯片支持的PWM Input模式、从模式复位和双通道捕获组合。
根据输入频率范围配置PSC和ARR,让计数分辨率、最大测量周期和中断负载达到平衡。频率跨度很大时,可考虑溢出扩展计数、DMA或周期性更新计数。
三、工程判断对照

面试中不要把“捕获中断里读取CNT”说成输入捕获。真正的输入捕获是硬件在边沿到来时锁存CCR,软件只负责读取和计算;另外,fCNT必须使用定时器实际计数时钟,而不是想当然使用CPU主频。
如果输入信号频率很低,两个上升沿之间定时器已经溢出两次以上,单纯用CCR2-CCR1还能算出正确周期吗?你会如何扩展计数范围?
技术资料:ST:How to use the input capture feature;STMicroelectronics:STM32Cube输入捕获示例与溢出说明

扫码关注
































