文章目录
[蓝桥杯嵌入式有手就行]系列文章
前言
一、内部结构
1、框图
二、定时器输入捕获原理分析
1、原理图
2、定时器同步
3、普通输入捕获模式
4、PWM输入模式(最常用)
三、代码示例
1、cubemx配置
2、上代码
四、问题
1、PSC和ARR取值问题
2、能否提供定时器例程
总结
前言
注:本系列基于2023年蓝桥杯实战情况就行编写,所有软件均采用2023年赛点资源包
上一节我们已经讨论了定时器输出部分,那么本节讨论相对麻烦的输入捕获。这里我还是建议直接读取寄存器 ,代码相对简洁明了。
定时器输出和输入的例程已经上传,看不见的话等待几天(23.11.4上传的,需要时间审核)。
一、内部结构
1、框图

这节我们只看中间左侧的粉色部分,即输入捕获部分。
这里需要注意一下三点
同一时刻,某个引脚只能作为输入/输出
一个引脚是输入/输出,该定时器所有的引脚都是输入/输出
如果CCxIE=1,使能中断位,产生中断,CCxIF(捕获中断标志)=1,计数值CNT将被锁存到CCRx中
二、定时器输入捕获原理分析
1、原理图

2、定时器同步
有些时候,我们可能需要定时启动定时器,比如每隔1分钟检测一次输入频率。这个时候我们救需要将一个定时器A作为主模式控制器,另一个作为从模式控制器B。

步骤如下:
使用A定时器作为B定时器的预分频器
使用A定时器使能B定时器的触发信号
使用A定时器去启动B定时器更新事件
使用一个外部触发器触发同步地启动2个定时器
3、普通输入捕获模式
详细过程可以查看参考手册28.3.9章节

核心功能:
捕获定时器的数值
产生中断
4、PWM输入模式(最常用)
以参考手册28.3.10章节内容为准,本文在其基础上有所简化。
首先,我们需要明确几个概念
一个通道的PWM输入捕获需要同时使用一个定时器的2个通道(1和2或者是3和4),但是只占用一个引脚。比如PA1输入PWM波,从引脚上看只占用了PA1引脚,但是对于定时器来说,TIM2_CH1和TIM_CH2都被占用了。
输入引脚通往的定时器通道的CCR寄存器保存周期值(两个连续上升沿之间的间隔),另一个没有占用引脚的定时器通道的CCR寄存器保存脉冲宽度 (两个连续上升沿和下降沿之间的间隔)。也就是Figure 300图中的IC1和IC2。
两个通道检测的极性是相反的(如Figure 300图所示)
从引脚输入信号的通道应该作为触发源(以PA1通过TIM2_CH2捕获为例,触发源应该设置为TI2FP2),并且将定时器的从模式设置为复位模式。


捕获过程:
当PWM信号由TI1进入,配置TI1FP1作为触发信号,上升沿捕获
当上升沿的时候,IC1和IC2同时捕获,计数器CNT清零
到达下降沿的时候,IC2捕获,此时CNT的值存入CCR2
到下一个上升沿的时候,IC1捕获,此时CNT的值存入CCR1
占空比=CCR2/CCR1
三、代码示例
1、cubemx配置


2、上代码
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
f = 10000 / TIM2->CCR2;
duty = 100 * TIM1->CCR1 / TIM2->CCR2;
}
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
}
四、问题
1、PSC和ARR取值问题
一般题目输入信号都是通过PA1,也就默认了使用TIM2_CH2。虽然定时器2的ARR是一个32位的,但是CCR是16位的,在100M主频下,ARR溢出需要42s,但是CCR在655us后就会溢出,因此PSC和ARR的取值需要考虑应用场景。
2、能否提供定时器例程
23.11.4晚上传,点这里跳转。可能需要2天左右审核。
总结
定时器内容是最多的,最好结合上面截取的手册内的示意图进行理解。