STM32 一共有 8 个都为 16 位的定时器。其中 TIM6、 TIM7 是基本定时器;TIM2、TIM3、 TIM4、 TIM5 是通用定时器; TIM1 和 TIM8 是高级定时器。这些定时器使 STM32 具有定时、信号的频率测量、信号的 PWM 测量、 PWM输出、三相 6 步电机控制及编码器接口等功能。
基本定时器TIM6 和TIM7,这两个定时器只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能触发中断或触发 DMA 请求。由于在芯片内部与 DAC 外设相连,可通过触发输出驱动 DAC。也可以作为其它通用定时器的时钟基准。
这两个基本定时器使用的时钟源都是 TIMxCLK,时钟源经过 PSC 预分频器输入至脉冲计数器(TIMx_CNT) ,基本定时器只能工作在向上计数模式,在重载寄存器(TIMx_ARR) 保存的是定时器的溢出值。工作时, 脉冲计数器 TIMx_CNT 由时钟触发进行计数,当 TIMx_CNT 的计数值 X 等于重载寄存器 TIMx_ARR 中保存的数值 N 时,产生溢出事件,可触发中断或 DMA 请求。然后 TIMx_CNT 的值重新被置为 0,重新向上计数。
通用定时器为TIM2~TIM5,主要用在测量输入脉冲的频率、脉冲宽与输出 PWM 脉冲的场合,还具有编码器的接口。
通用定时器比基本定时器多出的强大功能,就是因为通用定时器多出了一种寄存器——捕获/比较寄存器, TIMx_CCR(capture/compare register 简称CCR),它在输入时被用于捕获(存储) 输入脉冲在电平发生翻转时,脉冲计数器TIMx_CNT 的当前计数值,从而实现脉冲的频率测量;在输出时被用来存储一个脉冲数值,把这个数值用于与脉冲计数器 TIMx_CNT 的当前计数值进行比较,根据比较结果进行不同的电平输出 。
通用定时器可以利用 GPIO 引脚进行脉冲输出,在配置PWM输出功能时(或者比较输出功能时),捕获/比较寄存器 TIMx_CCR 被用作比较功能,配置脉冲计数器TIMx_CNT 为向上计数,重载寄存器 TIMx_ARR 被配置为 N,即 TIMx_CNT的当前计数值数值 X 在 TIMxCLK 时钟源的驱动下不断累加,当 TIMx_CNT 的数值 X 大于 N 时,会重置 TIMx_CNT 数值为 0 重新计数。而在 TIMxCNT 计数的同时, TIMxCNT 的计数值 X 会与比较寄存器TIMx_CCR 预先存储了的数值 A 进行比较,当脉冲计数器 TIMx_CNT 的数值 X小于比较寄存器 TIMx_CCR 的值 A 时, 输出高电平(或低电平),相反地,当脉冲计数器的数值 X 大于或等于比较寄存器的值 A 时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器 TIMx_ARR 存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器 TIMx_CCR 的值A 乘以触发脉冲的时钟周期,即输出 PWM 的占空比为 A/(N+1) 。
当定时器被配置为输入功能时,可以用于检测输入到 GPIO 引脚的信号(频率检测、输入 PWM 检测),此时捕获/比较寄存器 TIMx_CCR 被用作捕获功能。测量脉冲宽,需要两个捕获寄存器,在输入脉冲的不同边沿(pwm波的上升沿IC1和下降沿IC2)对TIM_CNT 的计数值进行捕获,得到这个 T1脉冲占空比为(N+1)/(A+1)。
要测量的PWM 脉冲通过 GPIO 引脚输入到定时器的脉冲检测通道把脉冲计数器 TIMx_CNT 配置为向上计数,重载计数器重载寄存器TIMx_ARR 的 N 值配置为足够大。
在输入脉冲 TI1 的上升沿到达时,触发 IC1 和 IC2 输入捕获中断,这时把脉冲计数器 TIMx_CNT 的计数值复位为 0,于是 TIMx_CNT 的计数值 X 在TIMxCLK 的驱动下从 0 开始不断累加,直到 TI1 出现下降沿,触发 IC2 捕获事件,此时捕获寄存器 TIMx_CCR2 把脉冲计数器 TIMx_CNT 的当前值 N1 存储越来,而 TIMx_CNT 继续累加,直到 TI1 出现第二个上升沿,触发了 IC1 捕获事件,此时 TIMx_CNT 的当前计数值 N2 被保存到 TIMx_CCR1。
很明显 TIMx_CCR1(加 1)的值乘以 TIMxCLK 的周期,即为待检测的 PWM输入脉冲周期, TIMx_CCR2(加 1) 的值乘以 TIMxCLK 的周期,就是待检测的PWM 输入脉冲的高电平时间(小于预留值时为高电平),有了这两个数值,就可以计算出 PWM 脉冲的频率、占空比了。