打印
[应用相关]

STM32—TIM

[复制链接]
575|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-8-2 10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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 定时器类型



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函数,这个函数就是用来配置这个时钟树的
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_60322134/article/details/140788824

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1923

主题

15596

帖子

11

粉丝