05STM32定时器-01定时器概述

内容概述

定时器是STM32中功能最强大、结构最复杂的一个外设,分为四部分:

一部分:定时中断功能

二部分:定时器输出比较,常见的用途:产生PWM波形,驱动电机(如驱动舵机和直流电机)

三部分:定时器输入捕获,测量方波频率

四部分:定时器编码器接口,更加方便地读取正交编码器的输出波形,在编码电机测速中应用广泛

定时器类型:

基本定时器:拥有定时中断、主模式出发DAC的功能

通用定时器:拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能

高级定时器:拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能。

高级定时器中比通用定时器多的功能主要是为了三相无刷电机的驱动设计的。

建议学习路径:通用定时器->高级定时器

时基单元

预分频器、计数器和自动重装寄存器构成最基本的计数计时电路,这一块叫时基单元。

预分频器:对计数时钟进行预分频,实际分频系数=预分频器的值+1。预分频器是16位的,所以最大值是65536分频。

计数器:对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的值就加1。计数器是16位的,里面的值可以从0-65535。

自动重装寄存器:存储目标值的寄存器。

计数器的值在计数过程中可以不断地自增运行,当自增运行到目标值时,产生中断,并且清零计数器。计数器自动开始下一次的计数计时,那就完成了定时的任务。

向上的折线箭头,就代表会产生中断信号。这种计数值等于自动重装值产生的中断,叫做"更新中断",更新中断之后,就会通往NVIC,配置好NVIC的定时器通道,那定时器的更新中断就能得到CPU的响应。向下的箭头代表会产生一个事件,这里对应的事件叫做"更新事件",更新事件不会触发中断,但可以触发内部其他电路的工作。

在计数过程中修改了预分频器的值、或者自动重装载寄存器的值,甚至手动修改了计数器里面的值,后续再做分析。

预分频器时序

CK_CNT=CK_PSC/(PSC+1)

CK_PSC 预分频器的输入时钟

CNT_EN 计数器使能,高电平计数器正常运行,低电平计数器停止

CK_CNT 计数器时钟,既是预分频器的时钟输出,也是计数器的时钟输入,可以看到计数器未使能,计数器时钟不运行。

在计数器时钟的驱动下,下面计数器寄存器也跟随着时钟的上升沿不断自增,这里可以推断ARR自动重装值就是FC,当计数值计到和重装值相等,并且下一个时钟来临时,计数值才清零。同时下面产生一个更新事件。 这就是一个计数周期的工作流程。

下面的三行时序描述的是预分频寄存器的一种缓冲机制,预分频控制寄存器供用户读写,但并不直接决定分频系数,预分频缓冲寄存器是真正起作用的寄存器。比如在某个时刻,把预分频控制寄存器由0改成1,如果在此时改变时钟的分频系数,那么就会导致这里在一个计数周期内,前半部分和后半部分的频率不一样。当设计了缓冲寄存器,当计数计到一半的时候,改变了分频值,这个变化并不会立刻生效,而是会等到本次计数周期结束时,产生了更新事件,预分频寄存器的值才会传递到缓冲寄存器里面去,才会生效。最后也是,预分频器内部实际上也是靠计数来分频的。当预分频值为0时,计数器就一直为0,直接输出原频率。当预分频器值为1时,计数器就0101计数。在回到0时,输出一个脉冲。这样输出频率就是输入频率的2分频。预分频器的值和实际的分频系数之间有一个数的偏移。

计数器时序

CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)

增加到36的时候,发生溢出,那计到36的时候,再来一个上升沿,计数器清零,计数器溢出,产生一个更新事件脉冲,另外还会置一个更新中断标志位UF,这个标志位只要置1了,就会去申请中断,然后中断响应后,需要在中断程序中手动清零,这是计数器的工作流程。

手册中图里带黑色阴影的寄存器,都是有影子寄存器这样的缓冲机制的。包括预分频器、自动重装寄存器、和下面的捕获比较寄存器。所以计数器的这个ARR自动重装寄存器,也是有一个缓冲寄存器的。并且缓冲寄存器是用还是不用,可以自己设置

计数器无预装时序

就是没有缓冲寄存器的情况

突然更改自动加载寄存器,就是自动重装寄存器,由FF改为36,那计数值的目标就由FF变成了36,所以这里计到36之后,就直接更新,开始下一轮计数

计数器有预装时序

就是有缓冲寄存器的情况,通过ARPE位,就可以选择是否使用预装功能。

突然更改自动加载寄存器,就是自动重装寄存器,由F5改为36,那计数值的目标还是计到F5之后,产生中断事件,同时要更改的36才被传递到影子寄存器。

在下一个计数周期这个更改的36才有效。

所以可以看出,引入影子寄存器的目的实际上是为了同步,就是让值的变化和更新中断事件同步发生,防止在运行途中更改造成错误。

时钟源选择

基本定时器只能选内部时钟,就是系统频率。通用定时器还可以选择外部时钟模式1:外部输入脚(TIx); 外部时钟模式2:外部触发输入(ETR); 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器。

TRGI(Trigger In)单从名字来看,主要是用作触发输入来使用,这个触发输入可以触发定时器的从模式(后续再讲),本节讲的是这个触发输入当做外部时钟来使用的情况,当TRGI当做外部输入时钟来使用的时候,这一路叫做"外部时钟模式1。

TIMx_ETR 引脚上的外部时钟,ETR(External),比如可以在TIM2的ETR引脚上接一个外部方波信号,然后配置内部的极性选择,边沿检测和预分频器电路,再配置一下输入滤波电路,这些电路可以对外部时钟进行一定的整形,因为是外部的引脚的时钟,所以难免有毛刺,这些电路就可以对输入的波形进行滤波。滤波后的信号分为两路,上面一路ETRF进入触发控制器,然后就可以选择作为时基单元的时钟了。如果想在ETR外部引脚提供时钟,或者相对ETR时钟进行计数,把这个定时器当做计数器来用的话,那就可以配置这一路电路,在STM32中,这一路也叫做:"外部时钟模式2"

ETR引脚信号 既可以通过上面这一路进来当做时钟,又可以通过下面这一路进来当做时钟,两种情况对于输出而言是等价的,只不过下面这一路输入会占用触发输入的通道而已。

定时器级联

ITR信号是来自于其他定时器,从右边可以看出,主模式的输出TRGO可以通向其他定时器。那通向其他定时器的时候,就接到了其他定时器的ITR引脚上了。把它的更新事件映射到TRGO上,再通过这1路可以实现定时器级联的功能。

TI1F_ED,连接的是输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,ED(Edge 边沿的意思),也就是这一路时钟,上升沿和下降沿均有效。TI1FP1和TI2FP2获得,其中TI1FP1就是CH1引脚的时钟,TI2FP1就是CH2引脚的时钟,

一般情况下,外部时钟通过ETR引脚就可以了,设置这么复杂的输入,不仅仅是为了扩大时钟输入的范围,更多的是为了某些特殊应用场景而设计的。对于时钟而言,最常用的还是72MHz的时钟,如果要使用外部时钟,首选ETR引脚外部时钟模式2的输入,这一路最简单,最直接。

这是定时器的一个编码器接口,,可以读取正交编码器的输出波形,后续再讲。

右边是输出比较电路,总共4个通道,分别对应CH1-CH4的引脚,可以用于输出PWM波形,驱动电机。左边是输入捕获电路,总共4个通道,对应CH1-CH4的引脚,可以用于测量输入方波的频率等。中间的寄存器是捕获/比较寄存器,是输入捕获和输出捕获比较电路共用的。因为输入捕获和输出比较不能同时使用,所以寄存器共用,引脚也共用。

高级定时器

与通用定时器相比变动的部分:

1.申请中断的地方,增加了一个重复次数计数器,有了这个计数器之后,就可以实现每隔几个计数周期,才发生一次更更新事件和更新中断,原来的结构是每个计数周期完成后都会发生更新,这就相当于对输出的更新信号又做了一次分频,这里可以59s多再乘65536,

2.对输出比较模块的升级:DTG(Dead Time Generate)是死区生成电路,右边的输出引脚由原来的一个变为了两个互补的输出,可以输出一对互补的PWM波,这些电路是为了驱动三相无刷电机的,三相无刷电机还是比较常用,比如四轴飞行器,电动车的后轮、电钻等里面都可能是三相无刷电机,因为三相无刷电机的驱动电路需要三个桥臂,每个桥臂两个大功率开关管来控制,总共需要6个大功率开关管来控制,所以这里的输出PWM引脚的前三路就变为了互补的输出,而第4路却没什么变化。

为了防止互补输出的PWM驱动桥臂时,在开关切换的瞬间,由于器件的不理想,造成短暂的直通现象,所以前面加上了死区生成电路,在开关切换的瞬间,产生一定时长的死区,让桥臂的上下管全都关断,防止直通现象。

3.刹车输入的功能,是为了给电机驱动提供安全保障的,如果外部引脚BKIN(Break IN)产生了刹车信号,或者内部时钟失效,产生了故障,那么控制电路就会自动切断电机的输出,防止意外的发生。

主从触发模式

主从触发模式:它让内部硬件在不受程序的控制下实现自动运行,在一些情景下将极大地减轻CPU的负担。比如:在使用DAC时,会使用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,如果正常的思路来实现:就是先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出。但是会使主程序频繁被中断的状态,这会影响主程序的运行和其他中断的响应。

所以定时器设置了一个主模式:使用主模式可以把定时器的更新事件映射到触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射到TRGO(如何映射到TRGO的呢?),然后TRGO就会直接去触发DAC了,整个过程不需要软件的参与,实现了硬件的自动化。 除了主模式还有很多硬件自动化的设计,可以后续再做了解。

计时器模式:常使用向上计数模式,最符合人脑的逻辑思维。

程序编写

1.RCC开启时钟,基本上每个代码都是第一步,不用多想,打开时钟后,定时器的基准时钟和整个外设的工作时钟就都会同时打开了,

2.选择时基单元的时钟源,对于定时器中断,选择内部时钟源,

3.配置时基单元,包括预分频器、自动重装器、计数模式等,用一个结构体配置就好了

4.配置输出中断控制,允许更新中断输出都按NVIC

5.配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级

6.运行控制,整个模块配置完成后,还需要使能一下计数器,要不然计数器不会运行。

当定时器使能后,计时器就会开始计数了,当计数器更新时,触发中断。最后再写一个定时器的中断函数,这样这个中断每隔一段时间就能自动执行一次了。

相关推荐
Peter_Deng.6 小时前
单片机 - 位运算详解(`&`、`|`、`~`、`^`、`>>`、`<<`)
c语言·单片机·嵌入式硬件
Jack电子实验室7 小时前
STM32实现智能温控系统(暖手宝):PID 算法 + DS18B20+OLED 显示,[学习 PID 优质项目]
stm32·学习·算法
weixin_580382068 小时前
stm32 外部中断实现
stm32·单片机·嵌入式硬件
niuTaylor8 小时前
嵌入式硬件工程师从小白到入门-PCB绘制(二)
嵌入式硬件
Tlog嵌入式9 小时前
[项目]基于FreeRTOS的STM32四轴飞行器: 十二.角速度加速度滤波
stm32·单片机·嵌入式硬件·mcu·iot
Yesheldon9 小时前
高度电路中时序设计之二
嵌入式硬件·fpga开发·硬件架构·硬件工程·智能硬件
promising-w10 小时前
【TI MSPM0】PWM学习
单片机·学习·ti 单片机
Wallace Zhang10 小时前
STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断
笔记·stm32·学习
Mountain and sea11 小时前
机器人原点丢失后找回原点的解决方案与步骤
stm32·单片机·嵌入式硬件
0南城逆流011 小时前
【STM32】知识点介绍一:硬件知识
stm32·单片机·嵌入式硬件