嵌入式学习笔记5.定时器TIM
定时器工作原理
定时器的核心就是一个计数器模块,可以进行加一或减一计数。每出现一个计数信号,计数器的值就自动加一或减一。当计数值从0递增到最大值或者从最大值递减到0时,定时器可以向处理器发送中断请求。计数信号的来源可以选择非周期的外部输人信号或者周期性的内部时钟信号,这两种不同的计数信号决定了定时器的两种基本工作模式:计数模式和定时模式。
在衡量一个定时器的基本性能时,常常使用位宽进行描述,比如8位定时器或者16 位定时器。这里的位宽代表了定时器内部的计数器的位数,它决定了定时器的最大计数范围或者最大定时时间。16位计数器的最大计数值为65535(2"-1),32位计数器的最大值为4294967295(2-1)。
定时器相关的一些基本概念:
(1)计数模式
对引脚输入的外部脉冲信号进行计数。
(2)定时模式
对处理器内部的周期性时钟信号进行计数。
(3)定时时钟
在定时模式下,输入定时器的周期性时钟信号称为定时时钟。
(4)计数时间
在定时模式下,定时器内部的计数单元记一次数所花费的时间称为计数时间,该值为定时时钟频率的倒数。
定时器的定时时间计算公式:
- 定时时间=计数值×计数时间
- 定时时间=计数值/定时时钟频率
eg.当定时器的定时时钟为1MHz时,计数时间为1μs。此时,16位计数器的最大定时时间为65536μs,即65.536ms。
定时器分类
(1)基本定时器
几乎没有任何对外的输人/输出通道,常用作时间基准(时基),实现基本的定时功能。
(2)通用定时器
具备多路独立的捕获/比较通道,可以完成定时/计数、输入捕获、输出比较等功能,还可以连接其他的传感器接口,如编码器和霍尔传感器。
(3)高级定时器
高级定时器的功能最为强大,除了具备通用定时器的功能外,还增加了重复计数器、带死区控制的互补信号输出等功能,可用于电机控制等领域。
①定时/计数功能:用于产生时间基准以及测量外部脉冲的个数。
②输出比较功能:包括PWM输出、电平翻转、单脉冲输出以及强制输出等功能。
③输入捕获功能:用于测量输入信号的脉冲宽度。
计数模式
定时器的计数模块支持三种计数模式:递增计数、递减计数和中心对齐计数,并产生溢出事件,作为定时器的更新中断(定时中断)。
(1)递增计数(0->ARR)
计数器从0开始向上计数,当计数值等于ARR时,产生计数器上溢事件,并从0开始新一轮的计数周期。
(2)递减计数(ARR->0)
计数器从ARR开始向下计数,当计数值等于O时,产生计数器下溢事件,并从ARR 开始新一轮的计数周期。
(3)中心对齐计数(递增/递减计数)(0->ARR-1,ARR->1)
计数器从0开始向上计数,当计数值等于ARR-1时,产生计数器上溢事件:然后从 ARR开始向下计数,当计数值等于1时,产生计数器下溢事件。之后再从0开始新一轮的计数周期。
时基单元功能框图
定时时间计算公式:
定时时间=计数值/定时时钟频率
定时时钟频率:
计数值:ARR
Prescaler
用于设置预分频系数PSC,即预分频寄存器TIMxPSC的内容。Prescaler的取值范围为0~63335,实际的预分频系数为Prescaler+1。
CounterMode
用于设置计数模式,包括递增计数模式、递减计数模式和中心对齐计数模式。
注意:当定时器作为输出比较功能时,中心对齐计数模式又分成了三种。三种模式的区别在于输出比较中断标志的设置时间不同。
Period
用于设置自动重载值ARR,即自动重载寄存器TIMx_ARR的内容。如果是16位定时器,Period的取值范围为0~63335;如果是32位定时器,Period的取值范围为0~23² 1。由于计数脉冲要算上0,实际的计数值为Period+1。
注意:如果Period设置为0,计数单元将不会计数,即定时器不会启动。
ClockDivision
用于设置内部时钟CK_INT和采样时钟DTS之间的分频比。采样时钟的作用是根据用户设置的滤波长度对外部输人信号进行采样,可以防止因为输人信号上的噪声或边沿抖动而导致的误计数和误触发,主要用于计数功能和输人捕获功能。
RepetitionCounter
用于设置重复计数器的值。重复计数器是高级定时器中才具备的电路单元,它在 PWM输出时比较有用,可以产生指定脉冲个数的PWM波形。
AutoReloadPreload
用于设置自动重载寄存器TIMxARR的预装载功能,即自动重装寄存器的内容是更新事件产生时写人有效还是立即写人有效。
这里以用TIM10产生一个10ms中断翻转LED为例:
首先根据时间凑配PSC和ARR
这里将PSC+1设为10000,ARR+1设为100
Cube Mx配置
Keil的代码
tim.c文件里的定义
stm32f4_it.c文件里
stm32f4xx_hal_tim.c文件里
main.c文件里
实验现象:
TIM_10ms_led
常用定时器函数
定时器中断标志清除函数(_HAL_TIM_CLEAR_IT)
该函数用于清除定时器的各类中断标志,采用带参数的宏实现(宏函数),与普通函数相比,宏函数省去了函数调用的过程,执行效率较高
定时器计数值读取函数(_HAL_TIM_GET_COUNTER)
该函数用于读取定时器的计数值,采用带参数的宏实现(宏函数)