STM32—TIM

1、TIM简介

  • TIM(Timer)     定时器
  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断(周期=1/频率)
    • 在STM32中,定时器的基准时钟一般都是主频72MHZ,如果我对72MHZ计72个数,那就是1MHz也就是1us的时间,如果计72000个数,那就是1KHz也就是1ms的时间
  • 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
    • 计数器就是用来执行计数定时的一个寄存器,每来一个时钟,计数器加1
    • 预分频器,可以对计数器的时钟进行分频,让这个计数更加灵活,
    • 自动重装寄存器就是计数的目标值,就是我想要计多少个时钟申请中断
    • 最大59.65s的定时计算:72M/65536/65536,得到的是中断频率,再取倒数
    • 如果你嫌这个还不够长,STM32的定时器还支持级联的模式,也就是一个定时器的输出,当做另一个定时器的输入,这样加一起,最大定时间就是59.65s再乘2次65536
  • 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
  • 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

1.1 定时器类型

类型编号总线功能
高级定时器TIM1、TIM8APB2拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器TIM2、TIM3、TIM4、TIM5APB1拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器TIM6、TIM7APB1拥有定时中断、主模式触发DAC的功能

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

1.2 基本定时器

  • PSC预分频器:它可以对这个72MHZ的计数时钟进行预分频,光如这个寄存器写0,那就是不分频,或者说是1分频,这时候输出频率=输入频率=72MHZ,如果预分频器写1,那就是2分频,输出频率=输入频率/2=36MHZ,预分频器是16位的,所以最大值可以写65535,也就是65536分频
  • 计数器:这个计数器可以对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的值就加们,这个计数器也是16位的,所以里面的值可以从0一直加到65535
  • 自动重装寄存器:如果再加的话,计数器就会回到0重新开始,所以计数器的值在计时过程中会不断地自增运行,当自增运行到目标值时,产生中断,那就完成了定时的任务,所以现在还需要一个存储目标值的寄存器,那就是自动重装寄存器了,在运行的过程中,计数值不断自增,自动重装值是固定的目标,当计数值等于自动重装值时,也就是计时时间到了,那它就会产生一个中断信号,并且清零计数器,计数器自动开始下一次的计数计时

在这里图上画的一个向上的折线箭头,就代表这里会产生中断信号,像这种计数值等于自动重装值产生的中断,我们一般把它叫做“更新中断”,这个更新中断之后就会通往NVIC,我们再配置好NMIC的定时器通道,那定时器的更新中断就能够得到CPU的响应了

这里向下的箭头,代表的是会产生一个事件,这里对应的事件就叫做“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作

1.3 主模式触发DAC模式

它能让内部的硬件在不受程序的控制下实现自动运行,这个用途就是在我们使用DAC的时候,可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,如果用正常的思路来实现的话,就是先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发-次DAC转换,然后DAC输出,但是这样会使主程序处于频繁被中断的状态,这会影响主程序的运行和其他中断的响应

使用这个主模式可以把这个定时器的更新事件,映射到这个触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样,定时器的更新就不需要再通过中断来触发DAC转换了,仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC了,整个过程不需要软件的参与,实现了硬件的自动化,这就是主模式的作用

1.4 通用定时器

通用定时器和高级定时器还支持向下计数模式和中央对产模式,

中央对齐的计数模式,就是从0开始,先向上自增,计到重装值,申请中断,然后再向下自减,减到0,再申请中断,然后继续下一轮,依次循环,这是中央对齐模式

对于基本定时器而言,定时只能选择内部时钟,也就是系统频率72MHZ,到了通用定时器这里,时钟源不仅可以选择内部的72MHZ时钟,还可以选择外部时钟

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

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

除了外部ETR引l脚可以提供时钟外,下面这里还有一路可以提供时钟,就是TRGI
(Trigger ln),这一路从名字上来看的话,它主要是用作触发输入来使用的,这个触发输入可以触发定时器的从模式,暂且就可以把这个TRGI当做外部时钟的输入来看,当这个TRGI当做外部时钟来使用的时候,这一路就叫做“外部时钟模式1”,通过这一路的外部时钟:

  • 第一个就是ETR引脚的信号,这里ETR引|脚既可以通过上面这一路进来当做时钟,又可以通过下面这一路进来当做时钟,两种情况对手时钟输入而言是等价的,只不过是下面这一路输入会占用触发输入的通道而已
  • 然后第二个,就是ITR信号,这一部分的时钟信号是来白其他定时器的,从右边可以看出,这个主模式的输出TRGO可以通向其他定时器,那通向其他定时器的时候,就接到了其他定时器的ITR引I脚上来了,这个ITRO到ITR3分别来自其他4个定时器的TRGO输出,通过这一路我们就可以实现定时器级联的功能,比如我可以先初始化TIM3,然后使用主模式把它的更新事件映射到TRGO上,接着再初始化TIM2,这里选择ITR2,对应的就是TIM3的TRGO(与ITR2连接),然后后面再选择时钟为外部时钟模式1,这样TM3的更新事件就可以驱动TM2的时基单元,也就实现了定时器的级联
  • 这里还可以选择T1F_ED,这里连接的是这里输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,这里后缀加一个ED(Edge)就是边沿的意思,也就是通过这一路输入的时钟,上升沿和下降沿均有效,也就是通过这一路输入的时钟,上升沿和下降沿均有效
  • 最后,这个时钟还能通过T1FP1和TI2FP2获得,其中T11FP1是连接到了CH1引脚的时钟,TI2FP2连接到了CH2引脚的时钟

总结一下就是,外部时钟模式1的输入可以是ETR引|脚、其他定时器、CH1引脚的边沿、CH1引脚和CH2引脚 

ITR和定时器的连接关系:ITR是内部触发输入,可以用一个定时器作为另一个定时器的预分频器,这样就可以频率减小,从而使定时器课计数时间间隔变大,就是前面讲级联的定义

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

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

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

下半部分

右边这一块是输出比较电路,总共有四个通道,分别对应CH1到CH4的引脚,可以用于输出PWM波形,驱动电机

左边这一块是输入捕获电路,也是有四个通道,对应的也是CH1到CH4的引脚,可以用手测输入方波的频率等

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

1.5 高级定时器

右侧为新增部分

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

这个DTG(Dead Time Generate)是死区生成电路,右边这里的输出引脚由原来的一个,变为了两个互补的输出,可以输出一对互补的PWM波,这些电路是为了驱动三相无刷电机的,

三相无刷电机还是比较常用的,比如四轴飞行器、电动车的后轮、电钻等,里面都可能是这个三相无刷电机,因为三相无刷电机的驱动电路一般需要3个桥臂,每个桥臂2个大功率开关管来控制,总共需要6个大功率开关管来控制,所以这里的输出PWM引脚的前三路就变为了互补的输出,而第四路却没什么变化,因为三相电机只需要三路就行了,另外,为了防止互补输出的PWM驱动杯臂时,在开关切换的瞬间,由于器件的不理想,造成短暂的直通现象,所以前面这里就加上了死区生成电路,在开关切换的瞬间,产生一定时长的死区,让桥臂的上下管全都关断,防止直通现象

刹车输入的功能,如果外部引脚BKIN(BreakIN)产生了刹车信号,或者内部时钟失效,产生了故障,那么控制电路就会自动切断电机的输出,防意外的发生

2、定时中断基本结构

  • 运行控制,就是控制寄存器的一些位,比如启动停止、向上或向下计数等等,我们操作这些寄存器就能控制时基单元的运行了
  • 左边是为时基单元提供时钟的部分,左边是为时基单元提供时钟的部分,这里
    • 可以选择RCC提供的内部时钟,
    • 也可以选择ETR引|脚提供的外部时钟模式2
    • 还可以选择ITRx触发输入当做外部时钟,即外部时钟模式1,对应的有ETR外部时钟、IRx其他定时器、TIx输入捕获通道
  • 编码器模式,这一般是编码器独用的模式,普通的时钟用不到这个
  • 右边这里,就是计时时间到,产生更新中断后的信号去向,在中断输出控制前面,如果是高级定时器的话,还会多一个重复计数器,
  • 那这里中断信号会先在状态寄存器里置一个中断标志位,这个标志位会通过中断输出控制,到NVIC申请中断,为什么会有一个中断输出控制呢,因为这个定时器模块有很多地方都要申请中断

2.1 预分频器时序

2.2 计数器时序

2.2.1 计数器无预装时序

2.2.2 计数器有预装时序

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

在这个例子也可以看出,如果在这里不使用影子寄存器的话,F5改到36立刻生效,但此时计数值已经到了F1,已经超过36了,P1只能增加,但它的目标却是36,比还小这样F1就只能一直加,一直加,一直加到FFFF,再回到0,再加到36,才能产生更新,这就会造成一些小问题

3、RCC时钟树

这个时钟树,就是STM32中用来产生和配置时钟,并且把配置好的时钟发送到各个外设的系统,时钟是所有外设运行的基础,所以时钟也是最先需要配置的东西,我们之前说过,程序中主函数之前还会执行一个Svstemlnit函数,这个函数就是用来配置这个时钟树的

[6-1] TIM定时中断_哔哩哔哩_bilibili[6-1] TIM定时中断是STM32入门教程-2023版 细致讲解 中文字幕的第13集视频,该合集共计50集,视频收藏或关注UP主,及时了解更多相关视频内容。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1th411z7sn?t=2477.9&p=13

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32 TIM计算器是一种基于STM32微控制器的定时器/计数器功能的应用程序,可以用于进行各种计时和计数操作。STM32 TIM计算器不仅具备了普通的计时和计数功能,还能够实现PWM波形的生成、捕获和输出等高级定时器功能。除此之外,STM32 TIM计算器还支持多种定时器模式和中断机制,可以及时响应各种事件,如定时器溢出、捕获和比较等。在嵌入式系统中,如工控、智能家居、汽车控制等领域,STM32 TIM计算器的应用非常广泛。 STM32 TIM计算器的使用方法相对简单,只需要调用相应的库函数即可。例如,如果需要设置一个计时周期为1秒的定时器,可以使用以下代码: //初始化定时器TIM2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000 - 1; //计时周期为1秒 TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; //定时器时钟为72MHz,分频系数为7200 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化TIM2 //启动定时器 TIM_Cmd(TIM2, ENABLE); //等待定时器计满1秒 while (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET); TIM_ClearFlag(TIM2, TIM_FLAG_Update); //定时器计时结束 通过上述代码,即可实现1秒钟的时间计算,并且可以利用定时器的中断机制来响应计时结束事件,实现相应的功能。在实际应用中,可以根据具体需求来选择不同的计时器模式和功能,以实现更加丰富和多样化的应用场景。 ### 回答2: STM32Timer(定时器)是其非常重要的一个模块,而在Timer中的TIMTimer/Counter)则是最基本的计数器。STM32TIM计算器可以在计数时产生一些特定的事件,比如输出脉冲、产生中断或者触发DMA等,这种处理方式非常有用并且广泛地应用于各种领域,尤其是在嵌入式系统的开发中。 TIM计数器的工作原理是:每次计数器到达设定的值(ARR)时,都会产生一个计数事件,同时计数器的值将被重置为0。计数器的值可以通过下面的公式来计算: CNT = PSC * (ARR + 1) 其中,PSC是预分频器的值,用于减小定时器的计数频率,将它的时钟源(TIMx_CLK)分频后再输入给计数器;ARR是自动重装载寄存器的值,用于设定计数器的周期。 STM32 TIM计算器的主要功能是测量时间,也就是记录在一个时间段内发生事件的次数。例如,可以使用TIM计算器来测量PWM波形的周期和占空比、测量输入信号的脉冲宽度或者频率等。 为了实现上面的功能,需要配置TIM计数器,并将其与GPIO、DMA、NVIC等模块进行相应的连接。具体的步骤包括以下几个部分: 1. 配置TIM的时钟源和预分频器,并设置自动重装载寄存器的值(即所需计数周期); 2. 配置TIM的计数模式和计数方向,并使能计数器; 3. 配置TIM的输出模式和输出通道,如果需要输出脉冲的话; 4. 配置DMA或者NVIC模块,以便在计时完成后能够触发相应的事件。 总之,STM32TIM计算器可以广泛地应用于各种领域,并且具有高精度、高可靠性、低功耗等优点,在嵌入式系统开发中是非常有价值的。 ### 回答3: STM32 TIM计算器是一种基于ST公司的STM32微控制器的计时器。它具有高度精确性,能够进行高频率的计时和调整。TIM计算器可以用来生成PWM波形,实现定时器和定时器中断等功能。 STM32 TIM计算器还可以设置为输入捕获模式,在此模式下,它可以捕获外部引脚产生的频率和脉冲信号,以实现精确测量和控制,如电机控制、速度控制、频率计等应用。TIM计算器的输出可以连接到其他微控制器或芯片,以实现复杂的互动设计。 除了提供高精度和高可靠性的计时功能外,STM32 TIM计算器还具有很高的灵活性。开发者可以通过配置模式选择各种计时模式、停止模式、计数模式等,以满足各种应用需求。此外,TIM计算器还支持中断口和DMA,从而可以轻松实现多任务和高速数据传输。 总之,STM32 TIM计算器是一种高性能的计时器,提供了多种计时和测量功能,可以广泛应用于各种应用场景,如控制系统、测量系统、通讯系统等。 开发者可以通过使用STM32 TIM计算器来实现更高的可靠性和更高的精度,从而取得更满意的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值