高级计时器TIM1:概述与外部时钟模式实现外部脉冲计数
16位高级计时器TIM1概述
-
除了计时功能外,计时器也用于对输入信号进行计数、测量等
-
TIM1功能最为强大,涵盖上述功能,通用16位计时器计时器资源TIM2/3等也可用于计数、测量、PWM输出,但它们与TIM1相比功能有所缺失,因此本章节使用TIM1演示如何配置计数功能,TIM2/3的配置方法是类似的
-
高级的TIM1与通用的TIM2/3之间具体的功能差别,以及怎样使用TIM1/2/3作计时功能请查阅上一章
TIM1的特性
-
控制更精细
-
TIM1不仅和TIM2/3一样有16位的自动重装载寄存器,还有16位的预分频寄存器(同样分为高位和低位两个寄存器用以存放分频系数),对计数的控制更加精确
-
可以设置为向上/向下/双向三种计数模式,而其他TIM资源则只能向上计数
-
可以在指定数目的计数器周期之后更新寄存器
-
产生的中断事件更丰富,包括:更新事件(计数器溢出/计数器初始化/通过软件触发)、触发事件(计数器启动/停止/初始化/由内部或者外部触发计数)、输入捕获事件、输出比较事件、刹车信号输入事件
-
除了使能信号外,还有一个刹车输入信号,可以将定时器的输出信号复位或者置于一个已知状态
-
-
功能更丰富
- 配备同步电路,用于外部信号控制定时器和定时器直接的互连
- 拥有多达4个独立的捕获/比较通道TIM1_CH1-4,可配置为输入捕获、输出比较、PWM生成和单脉冲输出
-
TIM1的捕获/比较通道
TIM1拥有4个独立的捕获/比较通道,分别是TIM1_CH1-4;它们与GPIO的PC组引脚1-4引脚功能复用
这些通道功能强大,可以配置为输入捕获、输出比较、PWM生成和单脉冲输出功能
比如说,当配置CH1引脚为输入捕获时,外部的信号就能通过PC1引脚输入到单片机被捕获处理;而配置了CH2通道输出比较时,PC2引脚就会输出相应信号
TIM1的计数时钟源
-
与只能使用主时钟作时钟源的基本计数器不同,TIM1的时钟信号fCK_PSC可以有四种来源,具体使用何种时钟信号取决于TIM1被配置成什么模式
-
单片机内部主时钟fMASTER
即把TIM1用作计时功能,类似TIM4,见上一节
-
内部触发输入ITRx
使用一个定时器作为另一个定时器的预分配时钟
也就是计时器的级联,TIM1可以级联TIM5/6,TIM2/3/4则没有级联功能
-
外部时钟模式
使用单片机外部的脉冲信号作为时钟信号,该信号未必是周期的,因此TIM1此时发挥计数而非计时功能,TIM1支持两种方式的外部脉冲信号,对应两种外部时钟模式:
-
外部时钟模式1:外部时钟输入TIx:将外部脉冲信号通过通道传入单片机
-
外部时钟模式2:外部触发输入ETR:将外部信号通过专门的外部触发信号引脚TIM1_ETR传入
本节介绍TIM1的计数功能,因此以外部时钟模式的配置为主要内容
-
TIx外部时钟输入模式配置流程
-
所谓外部时钟源模式1,就是借助捕获/比较通道,将外部脉冲信号连接至相应通道,作为TIM1的fCK_PSC信号来源,如此实现计数功能(因为外部信号的频率并不一定是固定的,因此不能得到具体时间,这就和计时功能区分开来)
-
注意:TIM1有四个独立的通道,因此在配置时每个通道能单独配置其功能,相应的寄存器有四个对应各通道的配置位
但是,只有CH1和CH2能配置为外部时钟源模式1,接下来的配置以使用CH1为例
TIx配置简述
-
设置通道采样率及滤波器
配置捕获/比较模式寄存器TIM1_CCMR1的IC1F[3:0]位(位7:4)
采样率根据奈奎斯特定律需要是信号频率2倍,滤波器可以保持默认
-
设置外部信号边沿极性
这一步选定要检测信号的上升沿或下降沿,在对应边沿进行触发
配置捕获/比较使能寄存器TIM1_CCER1的CC1P位(位1),0为高电平有效,1为低电平有效
-
设置同步计数器触发输入源
这一步确定计数对象是哪一个触发输入
配置从模式控制寄存器TIM1_SMCR的TS[2:0]位(位6:4)
内部触发ITR0可连接的触发输入源有6种,对于CH1,我们需要使用的是滤波后的定时器输入1(TI1FP1),配置为101
-
设置使用外部时钟源模式1
在对外部信号采样、滤波并确定计数器输入源之后,就可以启用此模式
配置从模式控制寄存器TIM1_SMCR中的SMS[2:0]位为111,将外部脉冲信号连接到单片机的捕获/比较通道引脚
-
使能计数器
配置TIM1_CR1_CEN位为1,这和之前的计时功能是一样的
TIx模式相关寄存器
-
捕获/比较模式寄存器TIM1_CCMR1
IC1F位控制对信号的采样频率,IC1PSC则配置滤波器(可以不设置)
注意TIM1_CCMR1的CC1S位,其决定了寄存器的功能,被配置为不同功能将会决定之后的CCER寄存器各个位的功能
注意CCMR1只控制CC1通道,即CH1引脚;对于CH2/3/4,有CCMR2/3/4的CC2/3/4S位来配置其功能
-
捕获/比较使能寄存器TIM1_CCER1
主要配置CC1P位,决定信号边沿
注意在在输入或输出不同下模式,有些位功能是不同的;
另外CCER1中只有控制CH1与CH2的相应位,CH3和CH4的控制位在寄存器CCER2中,为CC3E/CC3P/CC4E/CC4P等
-
从模式控制寄存器TIM1_SMCR
TS位确定计数对象是哪一个触发输入,CH1使用TI1FP1(配置为101),CH2使用TI2FP2
SMS位控制计数的模式,外部时钟源模式1配置为111
-
控制寄存器TIM1_CR1
控制TIM1的各个功能,包括使能、更新事件中断、计数方向、自动预装载、中央对齐模式、单脉冲;在之后介绍TIM1其他功能的章节中还会用到
代码实现
-
配置CH1为外部时钟模式1
配置TIM1_CH1(PC1引脚)为外部时钟模式1的代码如下:
void TIM1_TIx_init() { TIM1_CCMR1 |= 0x30;//配置输入捕获通道CH1滤波器参数, IC1F[3:0]=0011 TIM1_CCER1 = 0x02;//配置边沿检测极性为低电平或下降沿, CC1P=1 TIM1_SMCR |= 0x50;//配置同步计数器触发输入, TS[2:0]=101 TIM1_SMCR |= 0x07;//配置从模式选择, SMS[2:0]=111 TIM1_CR1 |= 0x01;//使能TIM1计数器, CEN=1 }
-
对引脚初始化
在初始化外部时钟源模式1完成后,还需要配置其所使用的专门的捕获/比较通道:虽然有4个独立通道,但用作外部时钟模式的只能是1和2通道
这两个通道实际上是普通GPIO引脚的功能复用,因此需要对其引脚进行配置,使其为上拉输入模式以允许外部信号输入:
//TIM1_CH1对应PC1引脚的复用功能,TIM1_CH2对应PC2,以此类推 PC_DDR_DDR1 = 0;//配置PC1为输入引脚 PC_CR1_C11 = 1;//配置为弱上拉输入模式 PC_CR2_C21 = 0;//配置关闭外部中断
ETR外部触发输入模式配置流程
- 外部时钟源模式2启用了一个专门的外部触发信号引脚,即TIM1_ETR引脚(此引脚与PH4复用),将外部脉冲信号连接至此引脚进行计数,ETR的功能比较简单,没有TIx的捕获/比较通道可用
ETR配置简述
-
设置外部信号触发极性
配置外部触发寄存器TIM1_ETR,ETP位(位7)决定触发边沿,配置为1即低电平或下降沿有效,0为高电平或上升沿有效
-
设置信号预分频
配置TIM1_ETR的ETPS[1:0]位(位5:4),可以按需求将信号不分频/2/4/8分频
-
设置信号采样率和滤波器
配置TIM1_ETR的ETF[3:0]位(位3:0),设置采样率与滤波器配置
这一部分的参数与模式1的TIM1_CCMR1的IC1F[3:0]位是一样的
-
使能外部时钟源模式2
配置TIM1_ETR的ECE位(位6)为1即可
-
使能计数器
配置TIM1_CR1_CEN位为1
ETR模式相关寄存器
-
外部触发寄存器TIM1_ETR
外部触发只使用ETR寄存器即可完成配置
代码实现
-
ETR功能初始化
void TIM1_ETR_init() { TIM1_ETR|=0x80;//设置外部触发信号极性,ETP=1 TIM1_ETR|=0x30;//设置外部信号预分频参数,ETPS[1:0]=11 TIM1_ETR|=0x03;//设置外部触发滤波器,ETE[3:0]=0011 TIM1_ETR|=0x40;//设置使能外部时钟模式,ECE=1 TIM1_CR1|=0x01;//使能计数器,CEN=1 }
-
ETR引脚初始化
同外部时钟源模式1,TIM_ETR引脚与PH4功能复用,要对ETR引脚进行初始化
//将PH4配置为弱上拉输入模式作为外部脉冲信号输入,且不启用外部中断 PH_DDR_DDR4 = 0;//输入 PH_CR1_C14 = 1;//弱上拉 PH_CR2_C24 = 0;//关中断
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/untit1ed/p/18576036
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
请注意: 特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外