上一篇讲解了HAL库函数点灯,初步学习了如何使用CUBE MX创建工程文件,以及文末送出了获取HAL库函数API手册方法的小福利,本篇将继续学习HAL库函数中的定时器API使用方法。
上一篇讲解了使用HAL库函数点灯,在上一篇中我们使用了HAL_DELAY函数的延时作用实现了每个1s点亮LED灯,再每隔1s熄灭LED灯。本节将使用定时器的方式实现该功能。
STM32F103R6T单片机有3个定时器,分别挂载在不同的总线上,关于总线的知识点请参见系列教程--总线篇。TIM2、TIM3挂载在APB1总线上,TIM1挂载在APB2总线上。从下图可知,APB2总线速率即时钟频率可到72MHz,是APB1总线的2倍。
TIM1为高级定时器,可测量输入信号的脉冲长度和产生输出波形;TIM2、TIM3为通用型定时器。
3个定时器均各有4个通道,每个定时器的4个通道内定了各自对应的芯片引脚。
定时器每次达到要求后,便会产生一次更新事件,例如,结合项目要求,每次计时满1s后,产生一次更新事件,该事件负责点亮灯。
更新事件的更新周期计算公式如下:
其中,TIM_CLK是定时器的时钟输入;
PSC为16位预置数寄存器 (TIM1_PSC);
ARR 为16位自动重载寄存器 (TIM1_ARR);
RCR为16位重复计数器。
Update_event = 72*106/((1 + 1)*(65535 + 1)*(1))
Update_event = 549.3 Hz
下图为高级定时器TIM1的原理框图,主要模块是时基单元,该单元由
a)计数寄存器 (TIM1_CNT)
预置器可对计数器的时钟进行分频,分频因子范围为1至65536,配置数据写入TIMx_PSC register寄存器。
计数器的时钟频率(CK_CNT)=预置数的时钟频率(CK_PSC)/(PSC[15:0]+1),因为这里是从0开始,为了表示分频因子范围为1至65536,所以需要加1。
计数器的时钟频率(CK_CNT)由预置数寄存器的值决定,然后计数器按照该时钟频率(CK_CNT)的节拍进行计数,结果存入计数寄存器 (TIM1_CNT)。
可知,预置数寄存器的作用就是决定计数器的时钟频率(CK_CNT)。
注:需先将TIMx_CR1的CEN使能位置1。
c)自动重载寄存器 (TIM1_ARR)
该寄存器的作用是决定了计数器的计数范围。
回顾计数器的使用方法:
在使用计数器TIMER时,先确定计数器的计数周期也就是时钟周期,接着确定计数器的计数范围。
这里的计数范围就是由自动重载寄存器 (TIM1_ARR)决定的,同时每计满一次数便产生一次更新事件(UEV)。
如下图所示,如果TIM1_EGR寄存器的UG位置1也可产生一次更新事件(UEV)。
d)重复计数寄存器 (TIM1_RCR)等共四个寄存器组成,(TIM1共有19个寄存器)。
该寄存器的作用有以下两种:
1)预装载器有效时,可建立比较寄存器的更新速率;
2)相应中断使能时,可设置更新中断产生速率。
REP_CNT向下计数为0时就会产生更新事件,就会重新按照TIM1_RCR寄存器中设置的REP值开始新的计数。
该寄存器决定了重复计数的次数。
例如,计数器每次计数至5,一共需要重复20次,那么重复计数寄存器 (TIM1_RCR)需要设置为19(TIMx_RCR+1),自动重载寄存器 (TIM1_ARR)的值需要设置成5。
计数器的计数模式有向上计数、向下计数和中间计数三种模式。
上节描述可知,三种定时器都挂载不两种总线上,这两种总线其具有共同的时钟源。时钟源可分来以下两种:
因此,上式中的TIM_CLK可以有三种不同的选择时钟源。
定时器有4个通用模式,分别为:
该模式可用来测量外部信号,原理是:根据定时器时钟、预分频器和定时器分辨
率,可推导出最大测量周期。按照以下步骤配置寄存器:
a) 通过将 CCMRx 寄存器中的 CCxS 位置 1 选择有效输入。
b)通过对 CCMRx 寄存器中的 IC1F[3:0] 位执行写操作以编程滤波器,并通过对
IC1PSC[1:0] 位执行写操作以编程预分频器。
c)通过对 CCxNP/CCxP 位执行写操作以编程极性,即选择上升沿触发、下降沿触发或边沿
触发。
d)当输入通道检测到相应的计数器的值发生转变时,可使用输入捕捉模块进行捕捉。要获取外
部信号周期,需连续进行两次捕捉。通过将两次捕捉到的值相减可计算得到周期。
周期 = 捕捉(1) /(TIMx_CLK *(PSC+1)*(ICxPSC)*polarity_index(2))
两次连续捕捉值 CCRx_tn 和 CCRx_tn+1 的捕捉差值:
● 如果 CCRx_tn < CCRx_tn+1 :捕捉 = CCRx_tn+1 - CCRx_tn
● 如果 CCRx_tn > CCRx_tn+1 :捕捉 = (ARR_max - CCRx_tn) + CCRx_tn+1
如果使用上升沿触发或下降沿触发,则极性指数为 1 ;而如果选择边沿触发,则极性指数为 2 。
在边沿对齐模式或中心对齐模式下,这种定时器可在每个通道上单独生成 PWM 。其中:频
率由 TIMx_ARR 寄存器的值确定,占空比由 TIMx_CCRx 寄存器的值确定。
● 递增计数时,只要 CNT < CCRx,便激活通道 x ,否则禁止通道 x 。
● 递减计数时,只要 CNT > CCRx,便禁止通道 x ,否则激活通道 x 。
● 递增计数时,只要 CNT < CCRx,便禁止通道 x ,否则激活通道 x 。
● 递减计数时,只要 CNT > CCRx,便激活通道 x ,否则禁止通道 x 。
要将定时器配置为该模式:
1. 配置输出引脚:
a) 通过对 CCMRx 寄存器中的 CCS 位执行写操作以选择输出模式。
b) 通过对 CCER 寄存器中的 CCxP 位执行写操作以选择极性。
2. 通过对 CCMRx 寄存器中的 OCxM 位执行写操作以选择 PWM 模式(PWM1 或 PMW2)。
3. 分别在 ARR 和 CCRx 寄存器中编程周期和占空比。
4. 将 CCMRx 寄存器中的预装载位置 1 ,然后将 CR1 寄存器中的 ARPE 位置 1 。
5. 选择计数模式:
a) PWM 边沿对齐模式:计数器必须配置为递增计数或递减计数模式。
b) PWM 中心对齐模式:定时器模式必须为中心对齐计数模式(CMS 位不为“00”)。
6. 使能捕捉比较。
7. 使能计数器。