STM32F103C8T6

定时器(TIM)


级联:在STM32当中扩展定时范围:单个定时器的定时长度可能无法满足某些应用的需求。通过级联,可以实现更长时间的定时

高级定时器、通用定时器和基本定时器的结构图,看一下这三种定时器是怎么样来工作的,设计这些结构都能完成哪些任务。

1.1基本定时器(TIM6,TIM7)

中断信号:计数值等于自动重装值产生的中断称为 更新中断。这个中断之后会通往NVIC,再配置好NVIC定时器通道,定时器就更新中断就可以得到cpu响应了
时间信号:代表产生一个事件,叫做 更新事件更新事件不会触发中断,但可以触发内部其他电路工作

这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。
软件可以读写计数器、自动重装载寄存器和预分频寄存器,即使计数器运行时也可以操作。时基单元包含:

预分频寄存器(TIMx_PSC)

预分频器

在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9毫秒。如果我们需要更长时间的定时间隔,那么就需要预分频器对时钟进行分频处理,以降低定时器时钟(CK_CNT)的频率。

除此之外,也可以通过配置预分频器,来获取想要的定时器时钟频率。依然以上边的TIM1为例,如果我们想获取一个精确的1ms中断,如果不分频,72MHz的时钟对应每周期1/72us,十分不利于计算。这时候使用预分频器将其72分频后为1MHz,每周期1us,1000个计时周期即为1ms,这样既便于计算,定时也更加精确。

预分频器的工作的工作原理是,定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零(因为TIMx-PSC控制寄存器具有缓冲,可以在运行过程中改变它的数值,新的预分频数值将在下一个更新事件时起作用),同时,CNT计数器值+1。

由此可以看出,因为达到最大值后还要再tick一次才归零,所以定时器时钟频率应该为Fosc/(PSC+ 1)。其中Fosc是定时器的时钟源。比如想对时钟源进行72分频,那么预分频器的值就应该设置为71。

实际分频系数=预分频器的值+1
                        
原文链接:https://blog.csdn.net/Obito_TXP/article/details/125774710

计数器寄存器(TIMx_CNT)

计数器由预分频输出CK_CNT驱动,设置TIMx_CR1寄存器中的计数器使能位(CEN)使能计数器计数。这个计数器可以对预分频后的计数时钟进行计数,计数时钟每来一个上升滑,计数器的值就加1,由于这个计数器也是16位的,所以里面的值可以从0一直加到65535,如果再加的话,计数器就会回到0重新开始。所以计数器的值在计时过程中会不断地自增运行,当自增运行到目标值时,产生中断,那就完成了定时的任务,所以现在还需要一个存储目标值的寄存器,那就是自动重装寄存器了。
                        
原文链接:https://blog.csdn.net/weixin_54742551/article/details/132409170

自动重裝载寄存器(TIMx_ARR)

自动重装载寄存器是预加载的,每次读写自动重装载寄存器时,实际上是通过读写预加载寄存器实现。根据TIMx CR1寄存器中的自动重装载预加载使能位(ARPE),写入预加载寄存器的内容能够立即或在每次更新事件时,传送到它的影子寄存器。当TIMx CR1寄存器的UDIS位为’0’,则每当计数器达到溢出值时,硬件发出更新事件;软件也可以产生更新事件;关于更新事件的产生,随后会有详细的介绍

原文链接:https://blog.csdn.net/weixin_54742551/article/details/132409170


具体计数器溢出值(定时器时间)公式计算:

计数器溢出频率公式

其中:

  • foverflowf 是计数器溢出频率(计数器每次溢出的频率)。也就是CK_CNT_OV
  • fTIM​ 是计时器的输入时钟频率(也称为计时器时钟频率)。也就是CK_CNT
  • PSC 是预分频器的值(预分频寄存器的值),范围为 0 到 65535。
  • ARR 是自动重装载寄存器的值,范围为 0 到 65535。

在STM32F103C8T6微控制器中,计数器溢出频率取决于计时器的输入时钟频率、预分频器(Prescaler)的配置以及自动重装载寄存器(ARR, Auto-Reload Register)的值。计数器溢出频率的计算公式如下:

计数器溢出频率公式

foverflow=fTIM(PSC+1)×(ARR+1)f_{overflow} = \frac{f_{TIM}}{(PSC + 1) \times (ARR + 1)}foverflow​=(PSC+1)×(ARR+1)fTIM​​

其中:

  • foverflowf_{overflow}foverflow​ 是计数器溢出频率(计数器每次溢出的频率)。
  • fTIMf_{TIM}fTIM​ 是计时器的输入时钟频率(也称为计时器时钟频率)。
  • PSCPSCPSC 是预分频器的值(预分频寄存器的值),范围为 0 到 65535。
  • ARRARRARR 是自动重装载寄存器的值,范围为 0 到 65535。

参数说明

  1. 计时器输入时钟频率fTIM​

    • 这是计时器模块的时钟源频率。通常是APB1或APB2总线时钟频率。如果APB时钟进行了分频,那么计时器时钟可能会倍频(对于APB1时钟,小于等于36 MHz,倍频系数为2;对于APB2时钟,最大72 MHz)。
    • 例如,如果APB1时钟是36 MHz且不分频,则对应的计时器时钟频率也是36 MHz。
  2. 预分频器 PSC

    • 预分频器决定了计时器时钟的分频比。PSC+1PSC + 1PSC+1 的值就是计时器时钟分频的倍数。
    • 例如,若 PSC=7PSC = 7PSC=7,则时钟被分频8倍(即 8=7+18 = 7 + 18=7+1)。
  3. 自动重装载寄存器 ARR

    • 计数器从0计数到 ARR 时,计数器会溢出并重新开始计数。ARR+1ARR + 1ARR+1 的值就是计数器从0计数到 ARR的周期数。
    • 例如,若 ARR=999ARR = 999ARR=999,则计数器会在1000个计数后溢出。

1. 定时器的计数过程

首先,定时器的计数过程是基于定时器时钟频率 fTIM进行的。

  • 时钟频率 fTIMf​ 是计数器每秒钟计数的次数。
  • 计数器每经过一个时钟周期,计数器的值就增加1。

当计数器从0开始计数,到达 ARR(自动重装载寄存器的值)时,定时器会发生溢出并重新开始计数。

2. 计数器溢出周期 Toverflow​

溢出周期 ToverflowT​ 是指定时器从0计数到 ARR所需的时间。这段时间可以通过以下方式计算:

因此,整个溢出周期 Toverflow 可以表示为:

3. 进一步简化公式

4. 溢出频率 foverflow


1.2通用定时器(TIM2,3,4,5)

内部结构

也可以在引脚定义图中找到

红框所标出来的意思:这个TIM2的CH1和ETR脚都复用在PA0引脚,下面还有CH2、CH3、CH4(CH是通道)和其他定时器的一些引脚,也都可以在这里找到


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

1.2.1计数器模式

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


1.2.2时钟选择

时钟树

内部时钟(CK_INT)

外部时钟模式1:外部输入脚(TIx)

例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

1. 配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿
2. 配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持
IC2F=0000)

注: 捕获预分频器不用作触发,所以不需要对它进行配置

3. 配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性

4. 配置TIMx_SMCR寄存器的SMS=’111’,选择定时器外部时钟模式1

5. 配置TIMx_SMCR寄存器中的TS=’110’,选定TI2作为触发输入源

6. 设置TIMx_CR1寄存器的CEN=’1’,启动计数器

当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。

在TI2的上升沿和计数器实际时钟之间的延时,取决于在TI2输入端的重新同步电路


当这个TRGI当做外部时钟来使用的时候,这一路就叫做“外部时钟模式1”,那通过这一路的外部时钟都有:

1.ETR引脚的信号

2.ITR信号

这一部分的时钟信号是来自其他定时器,从右边可以看出,这个主模式的输出TRGO可以通向其他定时器,那通向其他定时器的时候,就接到了其他定时器的ITR引脚上来了

这个ITRO到ITR3分别来自其他4个定时器的TRGO输出,至于具体的连接方式是怎么的

通过这一路我们就可以实现定时器级联的功能。

先初始化TIM3,然后使用主模式把它的更新事件映射到TRGO上,接着再初始化TIM2,这里选择ITR2,对应的就是TIM3的TRGO,然后后面再选择时钟为外部时钟模式1,这样TIM3的更新事件就可以驱动TIM2的时基单元,也就实现了定时器的级联.

还可以选择TI1F_ED,这里连接的是这里输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,这里后缀加一个ED(Edge)就是边沿的意思,也就是通过这一路输入的时钟,上升沿和下降沿均有效

最后,这个时钟还能通过TI1FP1和TI2FP2获得

总结外部时钟模式1的输入可以是ETR引脚、其他定时器,CH1引脚的边沿、CH1引脚和CH2引脚。一般情况下外部时钟通过ETR引脚就可以了。上面设置这么复杂的输入,不仅仅是为了扩大时钟输入的范围,更多的还是为了某些特殊应用场景而设计的,比如为了定时器的级联而设计的ITRx引脚

注:对于时钟输入而言,最常用的还是内部的72MHz的时钟,如果要使用外部时钟,如果要使用外部时钟,首选ETR引脚外部时钟模式2的输入,这一路最简单、最直接。


外部时钟模式2:外部触发输入(ETR)

这个ETR(External)引脚的位置,可以参考一下引脚定义表。

可以看到这里有TIM2_CH1_ETR,意思就是这个TIM2的CH1和ETR都是复用在了这个位置,也就是PA0引脚,下面还有CH2,CH3,CH4和其他定时器的一些引脚,也都可以在这里找到。

那这里我们可以在这个TIM2的ETR引脚,也就是PA0上接一个外部方波时钟,然后配置一下内部的极性选择、边沿检测和预分频器电路,再配置一下输入滤波电路,这两块电路可以对外部时钟进行一定的整形。因为是外部引脚的时钟,所以难免会有的毛刺,那这些电路就可以对输入的波形进行滤波,同时也可以选择一下极性和预分频器。最后,滤波后的信号,兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟了。

如果你想在ETR外部引脚提供时钟或者想对ETR时钟进行计数,把这个定时器当做计数器来用的话,那就可以配置这一路的电路,在STM32中,这一路也叫做“外部时钟模式2“。

计数器,使用下列步骤:

1,本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF(握)= 0000
2,设置预分频器,置TIMx_SMCR寄存器中的早期胸腺祖细胞(1:0)= 1
3.设置在ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=0
4,开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1
5.,启动计数器,置TIMx_CR1寄存器中的CEN=1


计数器在每2个ETR上升沿计数一次。
在ETR的上升沿和计数器实际时钟之间的延时取决于在ETRP信号端的重新同步电路

内部触发输入(ITRx)(定时器同步)(外部时钟模式1)

所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。

配置定时器1为主模式,它可以在每一个更新事件UEV时输出一个周期性的触发信号。在TIM1_CR2寄存器的MMS='010’时,每当产生一个更新事件时在TRGO1上输出一个上升沿信号。

连接定时器1的TRGO1输出至定时器2,设置TIM2_SMCR寄存器的TS =‘000’,配置定时器2为使用ITR1作为内部触发的从模式。(为什么是‘000’,硬件底层已经根据不同选择定义好了)

然后把从模式控制器置于外部时钟模式1(TIM2 SMCR寄存器的SMS-111):这样定时器2即可由定时器1周期性的上升沿(即定时器1的计数器溢出)信号驱动。

最后,必须设置相应(TIMx_CR1寄存器)的CEN位分别启动两个定时器。如果OCx已被选中为定时器1的触发输出(MMS=1xx),它的上升沿用于驱动定时器2的计数器。
注:如果OCx已被选中为定时器1的触发输出(MMS=1xx),它的上升沿用于驱动定时器2的计数器。
这一段内容是涉及参考手册14.3.15的内容,关于这个模式还有更多功能,比如:使用一个定时器使能另一个定时器;使用一个定时器去启动另一个定时器;使用一个定时器作为另一个的预分频器;使用一个外部触发同步地启动2个定时器,感兴趣的可以自己去了解

编码器模式

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

这部分电路可以把内部的一些事件映射到这个TRGO引脚上,比如我们刚才讲基本定时器分析的,将更新事件映射到TRGO,用于触发DAC。这里也是一样,它可以把定时器内部的一些事件映射到这里来,用于触发其它定时器、DAC或者ADC,可见这个触发输出的范围是比基本定时器更广一些的。

输入捕获输出比较电路粗讲

了解:通用定时器中异或门的作用

1.3高级定时器略

36.00

2.TIM定时中断

首先中间最重要的还是PSC(Prescaler)预分频器、CNT (Counter)计数器、ARR (AutoReloadRegister)自动重装器这三个寄存器构成的时基单元。下面这里是运行控制,就是控制寄存器的一些位,比如启动停止、向上或向下计数等等,我们操作这些寄存器就能控制时基单元的运行了。

左边是为时基单元提供时钟的部分,这里可以选择RCC提供的内部时钟,也可以选择ETR引脚提供的外部时钟模式2。在本小节示例程序里,第一个定时器定时中断就是用的内部时钟这一路,第二个定时器外部时钟就是用的外部时钟模式2这一路。当然还可以选择这里的触发输入当做外部时钟,即外部时钟模式1,对应的有ETR外部时钟、TTRX其他定时器、TlX输入捕获通道,这些就是定时器的所有可选的时钟源了。最后这里,还有个编码器模式,这一般是编码器独用的模式,普通的时钟用不到这个。

接下来右边这里,就是计时时间到,产生更新中断后的信号去向。那这里中断信号会先在状态寄存器里置一个中断标志位,这个标志位会通过中断输出控制,到NVIC申请中断。

为什么会有一个中断输出控制呢?

因为这个定时器模块有很多地方都要申请中断。比如上面这个图不仅更新要申请中断,这里触发信号也会申请中断,还有下面的输入捕获和输出比较匹配时也会申请。所以这些中断都要经过中断输出控制,如果需要这个中断,那就允许,如果不需要,那就禁止。简单来说,这个中断输出控制就是一个中断输出的允许位。
                        
原文链接:https://blog.csdn.net/weixin_54742551/article/details/132409170

代码

定数去中断,代码实战

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值