TIM 定时中断

目录

一、TIM 简介

二、定时器类型

1、基本定时器

2、主从模式触发DAC功能

 3、通用定时器

1.内外时钟源选择

 2.下部分内容​编辑

4、高级定时器

5、定时中断基本结构

 6、预分频器时序

7、计数器时序 

 8、计数器无预装时序

  9、计数器有预装时序

 10、RCC 时钟树


一、TIM 简介

        TIM(Timer)定时器,定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断,这是定时器最基本的功能,就是定时触发中断。(定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候,那他在对这个基准时钟进行计数的过程,就是计时的过程)。

        比如在stm32中,定时器的基准时钟一般都是主频72MHz,比如我对72MHz即72个数,那就是一MHz,也就是1微秒的时间,如果记72000个数,那就是1000Hz,也就是1ms的时间。

        16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时(即预分频器设置最大,自动重装也设置最大)。即这里计数器就是用来执行计数定时的一个计算器,每来一个时钟,计数器加一。预分频器让这个技术更加灵活,自动重装寄存器就是技术的目标值,就是我们想要记多少个时钟申请中断。

  1. 16位计数器:这意味着计数器能够存储的最大值是2^16−1=65535。一旦计数器达到这个最大值,如果再增加,它将回绕到0。这就是所谓的溢出。

  2. 预分频器:预分频器用于降低输入时钟频率的速度,使得计数器不会太快地达到其最大值。例如,如果你设置预分频器为7200,那么每7200个输入时钟脉冲,计数器只会增加1。这有效地减慢了计数过程,允许更长的定时周期。

  3. 自动重装寄存器:当计数器达到预定的值(通常是设定的比较值或它的最大值)时,它会自动重置为其初始值(通常由自动重装寄存器设定)。这样就可以创建一个循环的定时事件。

  4. 72MHz计数时钟:这是指提供给定时器的原始时钟频率。在这个例子中,每秒钟有72,000,000个时钟脉冲。

要计算最大定时时间,我们需要知道预分频器的最大值。假设预分频器也是16位,即它可以设置的最大值为65535。因此,最大的定时时间可以通过以下方式计算:

最大定时时间=计数器最大值+1 / 输入时钟频率 / 预分频器最大值

=65536 / 72,000,000 / 65536≈59.65秒=72,000,000 / 65536​≈59.65秒

也可以使用 72000000 / 65536 /65536 取倒数。

这里,我们用“计数器最大值+1”是因为计数是从0开始的。所以,通过正确配置预分频器,你可以让定时器在72MHz的输入时钟下,利用16位计数器实现大约59.65秒的最大定时。实际应用中,可能需要根据具体的硬件文档调整预分频器的值来获得所需的定时周期。

注意:STM32中定时器还支持级联模式,也就是一个定时器的输出作为另外一个定时器的输出,这样最大的定时时间就是59.65 *65536 ^ 2(n - 1),这里的n(n>=2)就是连接了几个定时器。

        定时器不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能 。根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型,其中高级定时器最为复杂,通用定时器中等复杂,最常用基本定时器最简单。

二、定时器类型

 STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

高级定时器连接的是性能更高的APB2总线,通用和基本定时器连接APB1总线。

1、基本定时器

         基准计数时钟的输入: 由于基本定时器只能选择内部时钟,可以直接认为这根线直接连到了输入端,即内部时钟CK_INT,内部时钟的来源是RCC的TIMxCLK,这里的频率值一般都是系统的主频72MHz,所以通向时基单元的技术基准频率就是72MHz。

        预分频器:对72MHz的计数时钟进行预分频。如果为0,就不分频,或者叫1分频,此时输出频率等于输入频率等于72兆MHz。如果写1,就是二分频,输出频率等于输入频率除以二,等于36MHz,如果写2就是三分频,以此类推。即实际分频系数等于预分频器的值加一,预分频器是16位的, 也就是65536分屏。即预分频器是对输入的基准频率提前进行一个分频操作。

        计数器:计数器可以对预分屏后的技术始终进行计数,计数时钟每来一个上升沿计数器的值就加一,这个计数器也是16位的,所以里面的值可以从零一直加到6535,如果再加的话,计数器就会回到零重新开始,所以计数器的值在计时过程中会不断的自增运行,当达到自身运行的目标值时产生中断,那就完成了定时的任务。所以现在还需要一个存储目标值的计算器,即自动重装寄存器。

        自动重装寄存器:自动重装寄存器也是16位的,它存的就是我们写入的计数目标,在运行的过程中,计数值不断自增,自动重装值是固定的目标,当计数值等于自动重装值时, 就是计时时间到了,那它就会产生一个中断信号,并且清零计数器,计数器自动开始下一次的计数计时。

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

2、主从模式触发DAC功能

        stm32定时器的一大特色就是这个主从触发模式,它能让内部的硬件在不受程序的控制下实现自动运行,如果能把这个主从触发模式掌握好,那在某些情景下将会极大的减轻cpu的负担。

        如上图所示:这个用途就是在我们使用DAC的时候,可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,如果用正常的思路来实现的话,就是先设置一个定时器产生中断, 每隔一段时间在中断程序中调用代码,手动触发一次DAC转换,然后DAC输出。

        上面的描述是没有问题的的,但是这样会使主程序处于频繁被中断的状态,这会影响主程序的运行和其他中断的响应,所以定时器就设计了一个主模式,使用这个主模式可以把这个定时器的更新事件映射的这个触发输出TRGO的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要再通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射的TRGO,然后TRGO就会直接去触发DAC的整个过程不需要软件的参与,实现了硬件的自动化这就是主模式的作用。如下图所示:

 3、通用定时器

         首先中间最核心的这一部分还是时基单元,这部分结构和基本定时器是一样的,由预分频器计数器自动重装计数器构成每部分的工作流程和基本定时器也是一样的,预分频器对时钟进行预分频,计数器自增技术当计数值达到自动重装值时计数值清零的同时产生更新中断和更新事件,不过对于通用定时器而言,这个计数器的计数模式就不止向上计数这一种。

        向上计数的模式,也就是计数器从零开始向上自增到重装寄存器的值清零,同时申请中断,然后开始下一轮依次循环。

        除了这种向上技术的模式外,通用定时器和高级定时器还支持向下对齐模式和中央对齐模式,向下对齐模式就是从重装值开始向下自减,减到零之后回到重装值,同时申请中断,然后继续下一轮依次循环。

        中央对齐模式就是从零开始先向上自增寄到重装值,申请中断,然后再向下自减减到零,再申请中断,然后继续下一轮依次循环。但是平时使用最多的还是向上计数。

1.内外时钟源选择

        对于基本定时器而言,定时器只能选择内部时钟,也就是系统频率72兆赫兹,到了通用定时器这里,时钟源不仅可以选择内部的72MHz时钟 还可以选择外部时钟,具体都有哪些呢 第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟,这个ETR引脚的位置可以参考 一下引脚定义表,如下图所示:可以看到,PA0引脚这里有TIM2_CH1_ETR,意思就是这个 TIM2 的 CH1 和 ETR 都是复用在了这个位置,也就是PA0引脚下面还有CH2。

         例如:我们可以在这个 TIM2 的 ETR 引角,也就是 PA0 上接一个外部方波时钟,然后配置一下内部的极性,选择边缘检测和预分频器电路,再配置一下输入滤波电路,这些电路可以对外部时钟进行一定的整形, 因为是外部硬件的时钟,所以难免会有些毛刺,那这些电路就可以对输入的波形进行滤波,同时也可以选择一下极性和预分频器。最后滤波后的信号兵分两路,上面引入ETRF 入触发控制器,紧跟着就可以选择作为时基单元的时钟了, 如果你想在 ETR 外部引脚提供时钟或者想对 ETR 时钟进行计数,把这个定时器当做计数器来用的话 那就可以配置这一路的电路,在STM32中 这一路也叫做外部时钟模式二。如下图所示:

         除了外部 ETR 引脚可以提供时钟外,下面这里还有一路可以提供时钟就是 TRGI 这一路从名字上来看的话,它主要是用作触发输入来使用的,这个触发输入可以触发定时器的从模式。现在暂且可以把这个 TRGI 当做外部时钟的输入来看, 当这个 TRGI 当做外部时钟来使用的时候, 这一步就叫做外部时钟模式一。

        通过外部时钟模式一的这一路的外部时钟都:第一个就是 ITR 引脚的信号。 这里 ETR 引脚既可以通过上面这一路来当做时钟, 又可以通过下面这一路来当做时钟 两种情况对于时钟输入而言是等价的。

        只不过是下面这一路输入会占用触发输入的通道而已, 然后第二个就是 ITR 信号, 下面这一部分的时钟信号是来自其他定时器的, 从右边可以看出来这个主模式的输出 TRGO 可以通向其他定时器,那通向其他定时器的时候就接到了其他定时器的 ITR 引脚上来了。

        这个 ITR0 到 ITR3 分别来自其他四个定时器的 TRGO 输出,至于具体的连接方式是怎么样的 手册的这个位置有一张表:

上图可以看出:TIM2 的 ITR0 接在了 TIM1的 TRGO 上的,ITR1 接在 TIM8,ITR2 接在TIM3,ITR3 接在了TIM4。

         通过这一路我们就可以实现定时器级连的功能, 比如我们可以先初始化TIM3, 然后使用主模式把它的更新事件映射到 TRGO 上, 接着再数字化TIM2, 这里选择 ITR2 对应的就是 TIM3 的TRGO, 然后后面再选择时钟为外部时钟模式一, 这样 TM3 的更新事件就可以驱动 TM2 的实际单元, 也就实现了定时器的级连。

         这里还可以选择 TIF_ED 这里连接的是这里输入捕获单元的 CH1 件 也就是从CH1 引脚获得时钟, 这里后缀加一个D 就是边缘的意思,也就是通过这一路输入的时钟上升沿和下降沿均有效 最后这个始终还能通过 TI1FP1 和 TI2FP2 获得。 即外部时钟模式一的输入可以是ETR引脚。 

 2.下部分内容

        右边是输出比较:总共有四个通道分别对应CH1 ~ CH4 的硬件,可以用于输出pwm波形驱动电机。 左边这一块是输入捕获电路,也是有四个通道 对应的也是CH1 ~ CH4 的硬件, 可以用于测量输入方波的频率等。

        电路共用的 因为输入捕获和输出比较不能同时使用,所以这里的寄存器是共用的,引脚也是共用的。

4、高级定时器

 高级定时器和中级定时器的主要区别是右边增加了的部分,如下图所示:

        增加了一个重复次数计数器,有了这个计数器之后就可以实现每隔几个计数周期才发生一次更新事件和更新中断,原来的结构是每个技术周期完成后都会发生更新, 现在有个计数器在这里可以实现每隔几个周期再更新一次,这就相当于对输出的更新信号又做了一次分屏,那对于高级定时器的话,我们之前计算的最大定时时间59秒多,在这里就还需要再乘一个6536,这就又提升了很多的定时时间了,这就是这个重复计数器的工作流程。  

        DTG是死区生成电路,右边这里的输出引脚由原来的一个变为了两个互补的输出,可以输出一对互补的 PWM 波,这些电路是为了驱动三向无刷电机的,三向无刷电机还是比较常用的,因为三下五刷电机的驱动电路一般需要三个墙壁,每个桥壁两个大功率开关管来控制,总共需要六个大功率开关管的控制,所以这里的输出 PWM 引脚的前三路就变为了互补的输出,而第四路却没什么变化啊因为三向无刷电机只需要三路就行了,为了防止在开关切换的瞬间,由于器件的不理想造成短暂的直通现象,所以前面这里就加上了死区生成电路,在开关切换的瞬间产生一定时长的死区,让墙壁的上下管全都关断,防止直通现象,那最后一部分就是刹车输入的功能是为了给电机驱动提供安全保障的,如果外部引脚产生了刹车信号或者内部时钟失效产生了故障,那么控制电路就会自动切断电机的输出,防止意外的发生,这就是刹车输入的功能。

5、定时中断基本结构

 6、预分频器时序

7、计数器时序 

 8、计数器无预装时序

  9、计数器有预装时序

 10、RCC 时钟树

        左边的都是时钟的产生电路,右边的都是时钟的分配电路啊,中间的这个system clock就是系统始终72兆赫兹在时钟产生电路,有四个震荡源,分别是内部的8MHz高速RC振荡器,外部的4~16MHz高速石英晶体振荡器,也就是晶振,一般都是接8MHz,外部的32.768KHz低速晶振这个一般是给RTC提供时钟的,最后是内部的40 KHz低速RC振荡器,这个可以给看门狗提供时钟上面这两个高速晶振,是用来提供系统时钟的,我们AHB、APB2、APB1的时钟都是来源于这两个高速晶振,这里内部和外部都有一个8MHz的竞争,都是可以用的,只不过是外部的石英振荡器比内部的RC振荡器更加稳定,所以一般我们都用外部晶振,但是如果你系统很简单,而且不需要那么精确的时钟,那也是可以使用内部rc振荡器的,这样就可以省下外部晶振的电路了。

注意:在不乱改SystemInit里面的默认配置情况下,无论是高级定时器,还是通用定时器,还是基本定时器他们的内部基准时钟都是72MHz。

猜你喜欢

转载自blog.csdn.net/LYH8543/article/details/146467062
今日推荐