正点原子STM32HAL库学习记录(stm32f103zet6)——通用定时器介绍

通用定时器

引言

本文基于《STM32F103 战舰开发指南V1.3》和相关ppt内容

简介

stm32f1中通用定时器有TIM1/TIM2/TIM3/TIM4
主要特性:16位递增、递减、中心对齐计数器(计数值:0 ~65535)16位预分频器(分频系数:1~65536)可用于触发DAC、ADC在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式使用外部信号控制定时器且可实现多个定时器互连的同步电路支持编码器和霍尔传感器电路等。
在这里插入图片描述

通用定时器框图

在这里插入图片描述

① 时钟源

在这里插入图片描述
1)内部时钟(CK_INT)
2)外部时钟模式 1:外部输入引脚(TIx), x=1, 2(即只能来自于通道 1 或者通道 2)
3)外部时钟模式 2:外部触发输入(ETR)
4)内部触发输入(ITRx):使用一个定时器作为另一定时器的预分频器

在这里插入图片描述

  • 1) 内部时钟(CK_INT)
    STM32F1 系列的定时器 TIM2/TIM3/TIM4/TIM5/ TIM6/TIM7 都是挂载在 APB1 总线上, 这些定时器的内部时钟(CK_INT)实际上来自于 APB1 总线提供的时钟。同基本定时器一样,当APB1的预分频系数>=2分频时,定时器时钟频率是APB1总线时钟频率的两倍。

  • 2) 外部时钟模式 1(TI1、 TI2)
    如名字一样,它的时钟信号来自外部。进入定时器流程如下:外部时钟源信号→IO→TIMx_CH1(或者 TIMx_CH2),这里要注意,时钟源信号只能从CH1或者CH2进入定时器。在配置定时器CH1和CH2时需要我们配置IO的复用功能。
    以通道2为为例进行说明:
    在这里插入图片描述
    时钟源通过CH2(通道2)进入定时器,“入乡随俗”,也就是TI2。首先,它先经过一个经过一个滤波器,可以通过ICFICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。
    接着,经过边沿检测器,通过设置CC2P来设置检测上升沿或者下降沿。
    然后,经过触发选择器,由 TS[4:0]位来选择 TRGI(触发输入信号)的来源。可以看到图 21.1.2 中框出了 TI1F_ED、 TI1FP1 和 TI2FP2 三个触发输入信号(TRGI)。 TI1F_ED 表示来自于 CH1,并且没有经过边沿检测器过滤的信号,所以它是 CH1 的双边沿信号,即上升沿或者下降沿都是有效的。 TI1FP1 表示来自 CH1 并经过边沿检测器后的信号,可以是上升沿或者下降沿。 TI2FP2 表示来自 CH2 并经过边沿检测器后的信号,可以是上升沿或者下降沿。这里以CH2 为例,那只能选择 TI2FP2。
    最后经过从模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。

  • 3)外部时钟模式 2(ETR)
    同名字一样,时钟信号来自芯片外部。时钟源进入定时器流程如下:外部时钟源信号→IO→TIMx_ETR。从 IO 到TIMx_ETR,就需要我们配置 IO 的复用功能,才能使IO 和定时器相连通。
    在这里插入图片描述
    首先定时器时钟信号首先从 ETR 引脚进来。
    接着经过外部触发极性选择器,由 ETP 位来设置上升沿有效还是下降沿有效,选择下降沿有效的话,信号会经过反相器。
    然后经过外部触发预分频器,由 ETPS[1:0]位来设置预分频系数,系数范围: 1、 2、 4、 8。
    紧接着经过滤波器器,由 ETF[3:0]位来设置滤波方式,也可以设置不使用滤波器。 fDTS 由TIMx_CR1 寄存器的 CKD 位设置。
    最后经过从模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。

  • 4) 内部触发输入(ITRx)
    内部触发输入是使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。
    在这里插入图片描述上图中, TIM1 作为 TIM2 的预分频器,需要完成的配置步骤如下:
    1, TIM1_CR2 寄存器的 MMS[2:0]位设置为 010,即 TIM1 的主模式选择为更新(选择更新事件作为触发输出 (TRGO))。
    2, TIM2_SMCR 寄存器的 TS[2:0]位设置为 000,即使用 ITR1 作为内部触发。 TS[2:0]位用于配置触发选择,除了 ITR1,还有其他的选择,详细描述如下图所示:
    在这里插入图片描述
    3, TIM2_SMCR 寄存器的 SMS[2:0]位设置为 111,即从模式控制器选择外部时钟模式 1。
    4, TIM1 和 TIM2 的 CEN 位都要置 1,即启动计数器。

② 控制器

控制器包括:从模式控制器、编码器接口和触发控制器(TRGO)。从模式控制器可以控制计数器复位、启动、递增/递减、计数。编码器接口针对编码器计数。触发控制器用来提供触发信号给别的外设,比如为其它定时器提供时钟或者为DAC/ADC 的触发转换提供信号。

③ 时基单元

时基单元包括:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。这部分内容和基本定时器基本一样的,大家可以参考基本定时器的介绍。
不同点是:通用定时器的计数模式有三种: 递增计数模式、 递减计数模式和中心对齐模式。

在这里插入图片描述
上图中,纵轴表示计数器的计数值,横轴表示时间, ARR 表示自动重载寄存器的值,小红点就是更新事件发生的时间点。举个例子,递增计数模式下,当计数值等于 ARR 时,计数器的值被复位为 0,定时器溢出,并伴随着更新事件的发生,后面继续递增计数。递减计数模式和中心对齐模式请参考前面的描述。
上表的描述属于硬件更新事件发生条件,我们还可以通过 UG 位产生软件更新事件。

④ 输入捕获

这一部分一般和第⑤部分一起完成测量功能。TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。 IO 端口通过复用功能与这些通道相连。配置好IO端口的复用功能后,将需要测量的信号输入到对应的IO端口输入捕获部分可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常见的测量有:测量输入信号的脉冲宽度、测量 PWM 输入信号的频率和占空比等。
下面解释下第④部分的细节:
在这里插入图片描述
以通道1的输入捕获为例:
待测信号通过TI1先经过一个滤波器,由 ICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。 f(DTS)由 TIMx_CR1 寄存器的 CKD 位设置。
接着经过边沿检测器,由 CC1P 位来设置检测的边沿,可以上升沿或者下降沿检测。 CC1NP是配置互补通道的边沿检测的,在高级定时器才有,通用定时器没有,所以不需要管。
然后经过输入捕获映射选择器,由 CC1S[1:0]位来选择把 IC1 映射到 TI1、 TI2 还是 TRC。这里我们的待测量信号从通道 1 进来,所以选择 IC1 映射到 TI1 上即可。
紧接着经过输入捕获 1 预分频器,由 ICPS[1:0]位来设置预分频系数,范围: 1、 2、 4、 8。
最后需要把 CC1E 位置 1,使能输入捕获, IC1PS 就是分频后的捕获信号。这个信号将会到达图 21.1.1 的第⑤部分。
第⑤部分的“放大版”,如下图所示:

在这里插入图片描述

灰色部分是输出比较功能部分,在第⑥部分时介绍。
首先看到捕获/比较预装载寄存器,我们以通道 1 为例,那么它就是 CCR1 寄存器,通道 2、通道 3、通道 4 就分别对应 CCR2、 CCR3、 CCR4。
图 左下角的 CC1G 位可以产生软件捕获事件,那么硬件捕获事件如何产生的?这里我们还是以通道 1 输入为例, CC1S[1:0] = 01,即 IC1 映射到 TI1 上; CC1E 位置 1,使能输入捕获;比如不滤波、不分频, ICF[3:0] = 00, ICPS[1:0] = 00;比如检测上升沿, CC1P 位置 0;接着就是等待测量信号的上升沿到来。当上升沿到来时, IC1PS 信号就会触发输入捕获事件发生,计数器的值就会被锁存到捕获/比较影子寄存器里。当 CCR1 寄存器没有被进行读操作的时候,捕获/比较影子寄存器里的值就会锁存到 CCR1 寄存器中,那么程序员就可以读取 CCR1 寄存器,得到计数器的计数值。检测下降沿同理。

⑤ 输入捕获和输出比较公用部分

该部分需要结合第④部分或者第⑥部分共同完成相应功能。

⑥ 输出比较

一般是和第⑤部分结合完成定时器输出功能。TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。 IO 端口通过复用功能与这些通道相连。

在这里插入图片描述
左边为输入捕获功能部分,已讲。这里右边就是输出比较功能了。
首先程序员写 CCR1 寄存器,即写入比较值。这个比较值需要转移到对应的捕获/比较影子寄存器后才会真正生效。什么条件下才能转移?图中可以看到 compare_transfer 旁边的与门,需要满足三个条件: CCR1 不在写入操作期间、CC1S[1:0] = 0 配置为输出、 OC1PE 位置0(或者 OC1PE 位置 1,并且需要发生更新事件,这个更新事件可以软件产生或者硬件产生)。当 CCR1 寄存器的值转移到其影子寄存器后,新的值就会和计数器的值进行比较,它们的比较结果将会通过第⑥部分影响定时器的输出。
第⑥部分通道 1 的“放大版”,如下图所示:
在这里插入图片描述
上图中,可以看到输出模式控制器,由 OC1M[2:0]位配置输出比较模式,该位的描述请参考《STM32F10xxx 参考手册_V10(中文版) .pdf》 相关定时器章节的 TIMx_CCMR1 寄存器。F1 系列有 8 种输出比较模式之多,后面用到再来介绍。
oc1ref 是输出参考信号,高电平有效,为高电平时称之为有效电平,为低电平时称之为无效电平。它的高低电平受到三个方面的影响: OC1M[3:0]位配置的输出比较模式、第⑤部分比较器的比较结果、还有就是 OC1CE 位配置的 ETRF 信号。 ETRF 信号可以将 Oc1ref 电平强制清零,该信号来自 IO 外部。
一般来说,当计数器的值和捕获/比较寄存器的值相等时,输出参考信号 oc1ref 的极性就会根据我们选择的输出比较模式而改变。如果开启了比较中断,还会发生比较中断。
CC1P 位用于选择通道输出极性。
CC1E 位置 1 使能通道输出。
OC1 信号就会从 TIMx_CH1 输出到 IO 端口,再到 IO 外部。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值