摘要:将用 TIM2 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。
先理解一下输入捕获的概念以及原理,概念:可以用来测量脉冲宽度或者测量频率
原理可以用简图来说明,如图下:
如图所示,输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图所示,t1~t2 之间,CNT 计数的次数等于: N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
简单的说,就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。
下面我们需要了解,定时器的输入捕获功能需要用到那些寄存器
寄存器:TIMx_ARR :自动重装载寄存器、 TIMx_PSC:预分频寄存器 、 TIMx_CCMR1 :捕获/比较模式寄存器 1、 TIMx_CCER:捕获/比较使能寄存器 、 TIMx_DIER :DMA/中断使能寄存器
、 TIMx_CR1:控制寄存器1 、TIMx_CCR1:捕获/比较寄存器
、 TIMx_CR1:控制寄存器1 、TIMx_CCR1:捕获/比较寄存器
1、TIMx_ARR :自动重装载寄存器,各位描述如下。

2、TIMx_PSC:预分频寄存器,各位描述如下。

该寄存器 用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。
3、TIMx_CCMR1 :捕获/比较模式寄存器 1,寄存器的各位描述如下

从图中可以看出, TIMx_CCMR1明显是针对2个通道的配置,低八位[7:0]用于捕获/比较通道1的控制,而高八位[15:8]则用于捕获/比较通道 2 的控制,因为 TIMx 还有 CCMR2 这个寄存器,所以可以知道CCMR2 是用来控制通道 3 和通道 4。重点介绍一下TIMx_CCMR1 的[7:0]位,如下图所示。

其中CC1S[1:0],这两个位用于CCR1的通道配置,这里我们设置IC1S[1:0]=01,也就是配
置 IC1 映射在 TI1 上。
输入捕获 1 预分频器 IC1PSC[1:0],1 次边沿就触发1 次捕获,所
以选择 00 就是了。
输入捕获 1 滤波器 IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。其中,
fCK_INT 是定时器的输入频率(TIMxCLK),一般为 72Mhz,而 fDTS 则是根据 TIMx_CR1 的
CKD[1:0]的设置来确定的,如果 CKD[1:0]设置为 00,那么 fDTS = fCK_INT。N 值就是滤波长度,举例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获到上升沿的时候,再以 fCK_INT 的频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设置 IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。
4、捕获/比较使能寄存器:TIMx_CCER,该寄存器的各位描述如下图

要使能输入捕获,这里要用到这个寄存器的最低 2 位,CC1E 和 CC1P 位,必须设置 CC1E=0,而 CC1P 则根据自己的需要来配置。
5、DMA/中断使能寄存器:TIMx_DIER,该寄存器的各位描述如下图

现在需要用到中断来处理捕获数据,所以必须开启通道 1 的捕获比较中断,即 CC1IE 设置为 1。
6、控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的

7、捕获/比较寄存器 1:TIMx_CCR1,该寄存器用来存储捕获发生时, TIMx_CNT 的值,我们从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。