STM32学习笔记【江科协】【6-1】TIM定时功能

本大节总共分为4个部分、8个小节。

第一部分,主要是定时器基本定时的功能,也就是定一个时间,让定时器每隔这个时间产生一个中断,来实现每隔一段时间执行一段程序的目的。具体可以应用在,做个时钟、秒表,或者使用一些程序算法。

第二部分,主要是定时输出比较功能,输出比较模块最常见的用途就是产生PWM波形,用于驱动电机等设备。在这个部分将学习到,使用STM32输出PWM波形来驱动舵机和直流电机的例子。

第三部分,主要是定时器输入捕获功能。在这个部分将学习到,输入捕获这个模块来实现测量方波频率的例子。

第四部分,定时器的编码器接口。使用这个编码器接口,能够更加方便地读取正交编码器的输出波形。在编码电机测速中,应用广泛。


TIM(Timer)定时器

  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
*在STM32中,定时器的基准时钟一般都是主频72MHz,对72MHz记72个数,那就是1MHz也就是1us的时间,记7200个数也就是1ms的时间
  • 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
*这里计数器就是用来执行计数定时的一个寄存器,每来一个时钟,计数器加1。
预分频器,可以对计数器的时钟进行分频,让这个计数更加灵活。
自动重装寄存器就是计数的目标值,也就是想要计多少个时钟申请中断
这一块电路构成了定时器最核心的部分,这一块电路被称为时基单元
2的16次方是65536,也就是如果预分频器设置最大,自动重装也设置最大,那定时器的最大的定时时间就是59.65s,接近一分钟,这个是靠72M/65536/65536,得到中断频率,然后取倒数,就是59.65s多
STM32定时器还接受级联的模式,也就是一个定时器的输入当作另一个定时器的输入,这样加一起,最大定时时间就是59.65*65536*655536,这个时间大概是八千多年,再级联一个定时器,定时时间还会再延长65536*65536倍,这个时间大概是34万亿年
  • 不仅具备基本的定时中断(第一部分)功能,而且还包含内外时钟源选择(第一部分)、输入捕获(第三部分)、输出比较(第二部分)、编码器接口(第四部分)、主从触发模式(第三部分)等多种功能
  • 根据复杂度和应用场景分为了高级定时器、通用定时器(课程所讲)、基本定时器三种类型

 高级定时器的多的功能,主要是为了三相无刷电机的驱动设计,本课程不会涉及到

  • STM32F103C8T6定时器资源:TIM1TIM2TIM3TIM4

*不同的型号,定时器数量是不同的,操作外设前,应该查一下是否有这个外设


基本定时器只能选择内部时钟,内部时钟来源是RCC_TIMxCLK,这里的频率值一般都是系统的主频72MHz,所以通向时基单元的计数基准频率就是72M

预分频器,对输入的基准频率提前进行一个分频操作,eg:如果预分频器写1,那就是2分频,输出频率=输入频率/2=36MHz,以此类推,所以预分频器的值和实际分频系数相差了1,即实际分频系数=预分频器的值+1。这里预分频器是16位的,所以最大值可以写65535,也就是65536分频

计数器,对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的值就加1,这个计数器也是16位的,所以里面的值可以从0一直加到65535,再加的话,计数器就会回到0重新开始,所以计数器的值在计时过程中不断地自增运行,当自增运行到目标值时,产生中断,那就完成了定时任务

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

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

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

主从触发模式,它能让内部硬件在不受程序控制下实现自动运行

主模式触发DAC,在使用ADC时,可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,使用这个主模式,可以把这个定时器的更新事件映射到这个触发TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要通过中断来触发DAC转换了,整个过程不需要软件参与,实现了硬件的自动化,这就是主模式的作用

最核心的部分时基单元,这部分结构还是和基本定时器一样的,每部分工作流程和基本定时器也是一样的

对于通用计时器而言,计数模式就不止向上计数这一种了,也就是计数器从0开始,向上自增,计到重装值,清零同时申请中断,然后开始下一轮,依次循环。通用计时器和高级计时器还支持向下计数模式和中央对齐模式。向下计数模式就是从重装值开始,向下自减,减到0之后,回到重转值同时申请中断。中央对齐模式,从0开始,先向上自增,计到重转值,申请中断,然后再向下自减,减到0,再申请中断。

通用定时器,时钟源不仅可以选择内部72MHz时钟,还可以选择外部时钟

第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟,ETR(External)引脚的位置,可以参考一下引脚定义表,在这个TIM2的ETR引脚,也就是PA0上接一个外部方波时钟,然后配置一下内部的极性选择、边沿检测和预分频电路,再配置一下输入滤波电路,这些电路可以对外部时钟进行一定的整形,因为是外部引脚的时钟,所以难免会有些毛刺,那这些电路就可以对输入的波形进行滤波,同时可以选择一下极性和预分频器,最后,滤波后的信号,兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟。想在ETR外部引脚提供时钟,或者想对ETE时钟进行计数,就把这个定时器当作计数器来用的话,可以配置这一路的电路。在STM32中,这一路也成为“外部时钟模式2”。

TRGI(Trigger In),主要是作为触发输入来使用的,可以触发定时器的从模式。当其作为外部时钟来使用时,这一路被叫做“外部时钟模式1”。通过这一路的外部时钟有,ETR引脚的信号(它有两条道路,只不过下面一条会占用触发输入的通道),ITR信号(这一部分时钟信号是来自其他定时器的)(右边看到的,主模式输出的TEGO可以通向其他定时器,那么就接到了其他定时器的ITR引脚上来了)(具体的连接方式见表),还可以选择TI1F_ED,(这里连接的是这里输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,这里加个后缀ED(Edge)就是边沿的意思,也就是通过这一路输入的时钟,上升沿和下降沿均有效),最后这个时钟还能通过TI1FP1*和TI2FP2*获得,总结来说外部时钟模式1的输入可以是ETR引脚、其他定时器、CH1引脚边沿、CH1引脚和CH2引脚。一般情况下,外部时钟通过ETR引脚就可以了,下面设置这么复杂的输入,不仅仅是为了扩大时钟输入范围,更多的还是为了特殊应用场景而设计的,比如定时器级联,后面部分会在输入捕获和测频率时用到

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

*
*

 接下来是下面的一部分,这一块总共包含了两块电路,右边这一块是输出比较电路,总共有四个通道,分别对应CH1到CH4的引脚,可以用于PWM输出波形驱动电机,左边这一块是输入捕获电路,也有四个通道,对应的也是CH1到CH4的引脚,可以用于测输入方波的频率等,中间的这个寄存器是捕获/比较寄存器,是输入捕获和输出比较电路共用的,因为输入捕获和输出比较不能同时使用,所以这里的寄存器是共用的,引脚也是共用的

 左上的一大部分都没有变化,主要改动的就是右边这几个部分



通过时序图,来研究一下时序单元运行的一些细节问题 

预分频器时序

 ​​​​​


计时器时序

 

 

 

 

 

 

 

 

 

 

 


时钟树,就是STM32中用来产生和配置时钟并且把配置好的时钟发送到各个外设的系统,时钟是所有外设运行的基础,所有时钟也是最先需要配置的东西

程序中主函数之前还会执行一个SystemInit函数,这个函数就是用来配置时钟树的

ST公司已经写好了配置这个时钟树的SystemInit函数

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值