一、定时器种类区分

上节我们学习了基本定时器,基本定时器的功能相对单一 ,stm32f1系列的芯片,通用定时器有4个,高级定时器有2个。
相同点:一个 16 位的可以向上/下计数的定时器,
一个16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值并且每个定时器有四个外部 IO。
支持定时、输出比较、输入捕捉、PWM生成。
不同点:高级定时器有三相电机互补输出信号,并且每个定时器有 8 个外部 IO。
二、定时器框图及讲解
2.1、通用定时器框图及讲解

2.1.1、时钟源
通用定时器有4个时钟源,分别为:
内部时钟源(CK_INT)
外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4)
外部时钟模式 2:外部触发输入 ETR
内部触发输入 (ITRx)
内部时钟源(CK_INT):
定时器中通用定时器和基本定时器是挂载在APB1(低速时钟总线)上,其经过倍频器倍频之后时钟频率可达最大的时钟频72MHZ。
外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4):

此时钟源信号来自于芯片外部,流程为外部时钟源信号→IO→TIMx_CH1(或者 TIMx_CH2)。从 IO 到 TIMx_CH1(或者 TIMx_CH2),就需要我们配置 IO 的复用功能,才能使 IO 和定时器通道相连通。
注意:此模式下,时钟源信号只能从 CH1 或者 CH2 输入到定时器,CH3 和 CH4 都是不可以的。
此模式下,以通道2为例,
1、时钟源经过滤波器滤除高频信号。
2、经过边沿检测器选择边沿检测方式(上升沿或者下降沿)。
3、经过触发选择器,选择触发输入信号(TRGI)。其中TI1F_ED 表示来自于 CH1,没有经过边沿检测器过滤的信号,所以它是 CH1 的双边沿信号,即上升沿或者下降沿都是有效的。TI1FP1 来自 CH1 并经过边沿检测器后的信号,可以是上升沿或者下降沿。TI2FP2 来自 CH2 并经过边沿检测器后的信号,可以是上升沿或者下降沿。这里以CH2 为例,那只能选择 TI2FP2。
4、之后经过从模式选择器,通过ECE位和SMS[2:0]来选择时钟源(外部始终模式1),最终经过CK_PSC、驱动计数器CNT,最后使能计数器开始计数,外部时钟模式一的配置就算完成了。
外部时钟模式 2:外部触发输入 ETR

1、此模式下,定时时钟信号由ETR引脚进来,经过ETP外部触发极性选择器来选择上升沿触发还是下降沿触发,选择下降沿会经过反向器。
2、之后经过外部触发预分频器来选择分频系数,分别为1、2、4、8分频。
3、之后经过滤波器进行滤波,也可以选择不进行滤波。
4、经过滤波器之后的信号,连接到ETRF引脚从模式选择为外部时钟模式2。
5、之后经过CK_PSC、驱动CNT计数器,并且使能计数器,外部时钟模式2就配置完成了。
内部触发输入 (ITRx):
内部触发输入是使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联,主模式的定时器可以对从模式定时器执 行复位、启动、停止或提供时钟
2.1.2、控制器

通用定时器的控制器包括触发控制器、从模式控制器和编码器接口,触发控制器主要是针对片内外设输出触发信号,比如为其他定时器提供时钟信号或者触发DAC/ADC转换。从模式选择器主要功能是控制计数器复位、使能、递增/递减、计数。编码器接口主要针对编码器接口设计。
2.1.3、时基单元

时基单元,主要包括计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器
(TIMx_ARR)。并且都是16位有效。通用定时器的计数模式有三种:递增计数模式、递减计数模式和中心对齐模式。
递增计数模式:CNT从0开始往上计数,直至计数至自动重载寄存器影子寄存器里的数值,之后计数器溢出,产生更新事件,计数器从零开始重新计数。
递减计数模式:CNT从自动重载寄存器影子寄存器里的数值开始往下递减,直至计数至0,之后计数器溢出,产生更新事件,计数器从自动重载寄存器影子寄存器里的数值开始重新计数。
中心对齐模式:CNT从0开始往上计数,直至计数至自动重载寄存器影子寄存器里的数值-1,之后计数器溢出,产生更新事件,之后CNT从自动重载寄存器影子寄存器里的数值开始递减计数至自动重载寄存器影子寄存器里的数值为1,之后计数器溢出,产生更新事件。然后又从0开始计数,循环往复。
2.1.4、输入捕获

TIMx_CH1—–TIMx__CH4是定时器的4个通道,输入捕获是通过外部的GPIO(GPIO需配置为复用模式)传入输入信号,然后经过输入滤波器滤除高频波或者低频波,之后输入信号经过边沿检测器(可以设置为上升沿、下降沿和双边沿),之后的IC1-IC4为输入捕获通道,并且每个通道都配有相应的捕获寄存器,当发生信号捕获时,计数器CNT的值,就会被锁存在捕获寄存器中。
比如再捕获高电平脉冲信号时间时,我们先设置电平检测为上升沿检测,当捕获到上升沿时,将此事的计数值保存在捕获寄存器(CCR1)中,并且电平检测设置为下降沿检测,当检测到下降沿时,再将此时的计数器数值保存在捕获寄存器(CCR1)中,之后我们将捕获寄存器(CCR1)里的两个数值取出相减,就可以得到高电平的脉冲信号持续时间。
输入捕获的配置步骤:
使能定时器和 GPIO 时钟
配置 GPIO 为输入模式(通常为浮空输入或上拉输入)
配置定时器基本参数(预分频器、自动重载值)
配置输入捕获模式(通道、极性、滤波等)
使能捕获中断(或 DMA)
启动定时器
2.1.5、输出比较

输出比较功能通过将定时器的计数器值(TIMx_CNT)与预设的比较值(TIMx_CCRx)进行实时比较,当两者匹配时触发特定动作。
输出比较有8种工作模式:
冻结:比较匹配时不改变输出电平,可以应用于时间标记、事件触发。
匹配时置 1:比较匹配时将输出置为高电平,可以应用于单脉冲触发、同步信号。
匹配时置 0:比较匹配时将输出置为低电平,可以应用于脉冲宽度控制。
匹配时翻转:比较匹配时翻转输出电平,可以应用于方波生成、频率测量。
强制输出 0:忽略比较结果,强制输出低电平,可以应用于紧急状态控制。
强制输出 1:忽略比较结果,强制输出高电平,可以应用于系统初始化。
PWM 模式 1:计数器向上计数:CNT<CCR 时为有效电平,反之无效
计数器向下计数:CNT>CCR 时为有效电平,反之无效
可以应用于电机控制、亮度调节
PWM 模式 2:计数器向上计数:CNT<CCR 时为无效电平,反之有效
计数器向下计数:CNT>CCR 时为无效电平,反之有效
可以应用于互补 PWM 输出
输出比较器的配置步骤:
使能定时器和对应 GPIO 时钟
配置 GPIO 为复用推挽输出(连接到定时器通道)
配置定时器基本参数(预分频器、自动重载值等)
配置比较模式和输出极性
使能定时器和输出比较通道
配置中断或 DMA(可选)
2.2、高级定时器框图及讲解

高级定时器与通用定时器只是在一些功能方面有所不同,如高级定时器有重复计数器、带死区控制的互补输出通道、断路输入,通用定时器则没有。其它方面高级定时器和通用定时器相同,这里就不再赘述了,想了解的参考上面的通用定时器。
2.2.1、重复计算器
我们在上面讲到了,通用定时器发生更新事件的条件是,计数器发生上溢或者下溢,有了重复计算器之后,计数器发生上溢或下溢时,重复计数器的寄存器REP里的数值(例如数值为N)会减1,直至数值减为0,所以当发生N+1上溢或者下溢,才会更新事件。
2.2.2、输出比较

高级定时器的输出比较功能和通用定时器的输出比较功能基本相同,只是多了一个死区控制的互补输出功能,其中的DTG是死区发生器,死区时间由DTG[7:0]位配置。
2.2.3、断路功能

刹车功能本质是强制关闭定时器的 PWM 输出,当触发刹车条件时,定时器的互补输出通道(如 TIM1_CH1、TIM1_CH1N)会立即进入预设的安全状态(通常是高阻态或固定电平),避免因故障导致的持续输出对硬件造成损害。
刹车信号的来源:
外部硬件刹车信号(BKIN)
定时器专用的刹车引脚(如 TIM1_BKIN),可通过外部电路(如比较器、传感器)输入故障信号。
可配置引脚极性(BKINP位):高电平有效或低电平有效。
内部软件触发
通过设置TIMx_EGR寄存器的BG位,软件主动触发刹车。
其他定时器联动
部分型号支持通过其他定时器的事件触发刹车(需配置TIMx_CR2的相关位)。
刹车后的输出状态配置:
刹车触发后,定时器输出通道的状态由TIMx_BDTR寄存器的MOE(主输出使能)和OSSI/OSSR位决定:
主输出使能(MOE 位)
刹车触发后,MOE位会被硬件清零,导致所有互补输出通道关闭。
空闲状态配置(OSSI/OSSR)
OSSI(离线状态选择):控制空闲时非互补通道的状态(高阻或上拉 / 下拉)。
OSSR(运行时离线状态选择):控制运行时互补通道的状态(即使MOE清零,仍可保持预设电平)。
默认安全状态
若未特殊配置,刹车后通道通常为高阻态(Hi-Z),避免输出冲突。
刹车功能的恢复机制:
刹车触发后,需通过软件操作恢复定时器输出,步骤如下:
清除刹车标志:读取TIMx_SR寄存器的BIF(刹车中断标志)位,然后写入 0 清除。
重新使能主输出:设置TIMx_BDTR寄存器的MOE位为 1。
(可选)重新启动定时器:根据需求配置CEN位(计数器使能)。
三、cubemx配置通用定时器的输入捕获功能
我们用按键来模拟电平信号,用定时器测量按键的高电平脉冲时间。
3.1、引脚复用


由原理图和参考手册可知,四个按键中只有PA0可以被复用为TIM2_CH1,并且将GPIO配置为下拉模式。

3.2、TIM配置

由时钟树可知,TIM2-TIM7搭载在APB1时钟总线上的,所以TIM2最大时钟频率为72Mhz。

1、时钟源选择内部时钟时钟源,72Mhz。
2、选择通道1的输入捕获模式。
3、因为在输入捕获时,要考虑输入捕获的时间会溢出,所以将预分频值设置为71,此时定时器的计数频率为1MHZ,对应的每个计数单位为1us。
4、定时器的计数周期设置为0xffff(65535),因为此寄存器最大的数值为16为即65535,对应的最大计数时间为=65535*1us=65.535ms,这样也可以减少中断频繁的触发,从而占用cpu资源。
5、由原理图可知,该按键是高电平有效,所以边沿触发模式,先配置为上升沿检测,后续在检测低电平再用软件改为下降沿检测。
6、按键在触发过程中可能会出现抖动,要配置滤波,该寄存器是4个位,最大是0x0f。
滤波消除的最大抖动时间 = 滤波阈值 × 采样周期 如此次配置的滤波阈值为0x0f,采样周期(时间)为1us,所以本次最大消抖时间为15*1us=15us,也就是说可以滤除小于15us的抖动。
3.3、NVIC配置

3.4、keil代码编写
tim.c


main.c

3.5、效果展示

四、cubemx配置通用定时器的PWM功能,驱动LED为呼吸灯效果
4.1、引脚复用


由原理图和参考手册可知,可以将PB5复用为TIM3_CH2。

4.2、TIM配置

1、时钟源配置为内部时钟源。
2、通道2配置为PWM模式
3、由时钟树可知,TIM2搭载在APB1总线上,最大时钟频率为72MHZ。
4、自动重载值设置1000,。
5、选择PWM1模式,上述我们介绍了PWM有两种模式。pwm1和pwm2。
6、占空比初始可以随意填,我这边设置的是500,占空比必须低于自动重载值。
7、通道极性选择低电平。
4.3、keil代码编写
tim.c

main.c


















暂无评论内容