目录
前言
本期我们就开始学习stm32的定时器了,在51的时候我们学习过了51单片机有两个定时器,分别是定时器0和定时器1,同样的stm32也有定时器,而且还是更加高级的定时器,可以说定时器是单片机的灵魂所在。那么本期我们就主要介绍stm32定时器的工作方式以及中断方式,下一期再进行与定时器相关的项目实操。(视频:[6-1] TIM定时中断_哔哩哔哩_bilibili)
一、TIM定时器
1.TIM简介
TIM(Timer)定时器
- 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
- 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
- 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
- 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
2.定时器的计数
时间计算
16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。
那么定时器是怎么计数呢?其实定时器有一个输入频率,72MHz,在这个时钟下我们会进行预分频处理,分频后的频率作为输入频率,然后开始计数,当计数达到我们预设的值(自动重装值)时候就完成这个周期,就开始去申请中断操作,此时计数溢出,计算器清零。
从这里我们就可以去计算出定时器的定时时间为:预分频值*自动重装值/时钟频率
预分频器和自动重装寄存器都是16位的所以,二者最大为65536,也就是2的16次方。那么得出的最大定时时间为:65536*65536/72MHz = 59.65s 是这样计算出来的。当然如果你嫌这个时间不够的话,我们还可以通过定时器联级定时,也就是一个定时器的输出作为另外一个定时器的输入,那么这个时间长度就相当可怕了也就是 59.65*65536*65536秒,人类文明历史都远不及这个时间长。
计数模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。一般情况都是用到向上计数最多,三种计数方式效果是一样的。
①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
3.定时器的分类
STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6)。
类型 | 编号 | 总线 | 功能 |
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
基本定时器
基本定时器就很好理解了,看下面结构图就知道了,基本上就是一个时基单元,这是定时器的核心部分。输入信号CK_PSC进入到预分频器,进行分频出CK_CNT信号输入到计数器当中,然后进行计数,达到溢出值的时候就向外部申请一个中断指令。基本定时器是有主模式的,也就是当计数完成之后,会有一个触发事件U,然后这个U会传入到触发控制器的TRGO上至DAC,这时候就会再次启动这个定时器,然后开始新的计数,这个过程都不需要软件来处理,一方面避免多次去申请中断来开启定时器,导致程序运行效果不好,另一方面也是实现了硬件自动化处理的高效性。
通用定时器
通用定时器相较于基本定时器就复杂多了,基本定时器有的功能通用定时器也是有的(时基单元)。通用定时器不同于基本定时器,其可以选择外部时钟,二基本定时器只能选择内部时钟72MHz,同时也能进行联级定时,也就是与其他定时器进行相连定时功能。另外还有输入捕获通道和输出比较通道(PWM)这两个后面会详细讲。
高级定时器
高级定时器相较于通用定时器多了重复计数的功能,也就是通用定时器要想实现超过59.65秒的时间计数的话就要用到另外一个定时器来进行联级定时,而高级定时器就不需要,其本身就可以实现这个功能,因为高级定时器多了个重复计数计算器。还有就是高级定时器还有一个时钟安全系统,当时钟信号出现了不合理的情况下,这个系统就会启动使得输出的PWM无效,也就是停止电机的输出,这方面是对机器的安全保护。
二、定时器中断
根据下图可以看到,当时基单元完成了一个计数周期的时候就会给中断输出控制一个中断输出位,这个中断必须通过中断输出控制来去过滤才能进入到NVIC申请中断,因为这个中断分为很多种类型,是判断这个定时器具体功能的,如果需要某个功能的中断那么就会打到这个中断的位置,而其他中断功能就禁止,最后进入到NVIC去申请执行这个功能。
三、定时器相关时序
1.预分频器时序
预分频器当进行时序变化的时候,stm32计数器输入的时序并不会立即变化,而是等上一个定时任务的周期完成了之后再进行变化。这里要用到的是预分频缓冲寄存器,这个寄存器是判断当前定时任务是否完成以及是否发生分频变化,如果有分频变化了,且当前定时任务未完成,那么就会按照原来的频率去继续完成这个定时任务,之后再去进行分频开启新的定时任务。
2. 计数器时序
计数器就是当计数完成了之后,出现了计数溢出,如下图计数到了36的时候此时这里就会产生一个计数溢出的高电平,然后出现一个更新事件,这时候就会去申请一个中断,同时定时器会进行自动重装重新开始定时。
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1)
下面再看两个计数器的时序
计数器无预装时序:
计数器有预装时序:
以上就是本期的全部内容了,我们下次见
每日壁纸: