本大节总共分为4个部分、8个小节。
第一部分,主要是定时器基本定时的功能,也就是定一个时间,让定时器每隔这个时间产生一个中断,来实现每隔一段时间执行一段程序的目的。具体可以应用在,做个时钟、秒表,或者使用一些程序算法。
第二部分,主要是定时输出比较功能,输出比较模块最常见的用途就是产生PWM波形,用于驱动电机等设备。在这个部分将学习到,使用STM32输出PWM波形来驱动舵机和直流电机的例子。
第三部分,主要是定时器输入捕获功能。在这个部分将学习到,输入捕获这个模块来实现测量方波频率的例子。
第四部分,定时器的编码器接口。使用这个编码器接口,能够更加方便地读取正交编码器的输出波形。在编码电机测速中,应用广泛。
TIM(Timer)定时器
- 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
- 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
- 不仅具备基本的定时中断(第一部分)功能,而且还包含内外时钟源选择(第一部分)、输入捕获(第三部分)、输出比较(第二部分)、编码器接口(第四部分)、主从触发模式(第三部分)等多种功能
- 根据复杂度和应用场景分为了高级定时器、通用定时器(课程所讲)、基本定时器三种类型
高级定时器的多的功能,主要是为了三相无刷电机的驱动设计,本课程不会涉及到
- STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
*不同的型号,定时器数量是不同的,操作外设前,应该查一下是否有这个外设
基本定时器只能选择内部时钟,内部时钟来源是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引脚就可以了,下面设置这么复杂的输入,不仅仅是为了扩大时钟输入范围,更多的还是为了特殊应用场景而设计的,比如定时器级联,后面部分会在输入捕获和测频率时用到
![](https://img-blog.csdnimg.cn/0162582cbe8543a2861b6c8d07a9c21a.jpeg)
![](https://img-blog.csdnimg.cn/88114567f05b44fe876bf2dd92dc9ed2.jpeg)
![](https://img-blog.csdnimg.cn/7c3d745690f94871b65809d16a1b1149.jpeg)
接下来是下面的一部分,这一块总共包含了两块电路,右边这一块是输出比较电路,总共有四个通道,分别对应CH1到CH4的引脚,可以用于PWM输出波形驱动电机,左边这一块是输入捕获电路,也有四个通道,对应的也是CH1到CH4的引脚,可以用于测输入方波的频率等,中间的这个寄存器是捕获/比较寄存器,是输入捕获和输出比较电路共用的,因为输入捕获和输出比较不能同时使用,所以这里的寄存器是共用的,引脚也是共用的
左上的一大部分都没有变化,主要改动的就是右边这几个部分
通过时序图,来研究一下时序单元运行的一些细节问题
预分频器时序
计时器时序
时钟树,就是STM32中用来产生和配置时钟并且把配置好的时钟发送到各个外设的系统,时钟是所有外设运行的基础,所有时钟也是最先需要配置的东西
程序中主函数之前还会执行一个SystemInit函数,这个函数就是用来配置时钟树的
ST公司已经写好了配置这个时钟树的SystemInit函数