零基础入门STM32编程(七)——定时器篇(HAL)

前情回顾

上一篇讲解了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倍。

零基础入门STM32编程(七)——定时器篇(HAL)_第1张图片

TIM1为高级定时器,可测量输入信号的脉冲长度和产生输出波形;TIM2、TIM3为通用型定时器

3个定时器均各有4个通道,每个定时器的4个通道内定了各自对应的芯片引脚。

零基础入门STM32编程(七)——定时器篇(HAL)_第2张图片

二 高级定时器

2.1 常用寄存器种类

定时器每次达到要求后,便会产生一次更新事件,例如,结合项目要求,每次计时满1s后,产生一次更新事件,该事件负责点亮灯。

零基础入门STM32编程(七)——定时器篇(HAL)_第3张图片

更新事件的更新周期计算公式如下:

其中,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)

b)预置数寄存器 (TIM1_PSC)

预置器可对计数器的时钟进行分频,分频因子范围为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。

2.2 计数模式

计数器的计数模式有向上计数、向下计数和中间计数三种模式。

2.3 时钟输入源

上节描述可知,三种定时器都挂载不两种总线上,这两种总线其具有共同的时钟源。时钟源可分来以下两种:

  • 内部时钟
  • 外部时钟

因此,上式中的TIM_CLK可以有三种不同的选择时钟源。

零基础入门STM32编程(七)——定时器篇(HAL)_第4张图片

三 定时器工作模式

定时器有4个通用模式,分别为:

  • 输入捕捉模式
  • 输出比较模式
  • PWM模式
  • 单脉冲模式

3.1 输入捕捉模式

该模式可用来测量外部信号,原理是:根据定时器时钟、预分频器和定时器分辨
率,可推导出最大测量周期。按照以下步骤配置寄存器:

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 。

3.2  定时器PWM模式

在边沿对齐模式或中心对齐模式下,这种定时器可在每个通道上单独生成 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.  使能计数器。

​​​​​​​

 

你可能感兴趣的:(单片机,stm32,单片机,arm)