STM32HAL库--定时器篇

        STM32F429 有14个定时器,其中包括

        2 个基本定时器(TIM6 和 TIM7)、

        10 个通用定时器(TIM2~TIM5,TIM9~TIM14)、

        2 个高级控制定时器(TIM1 和 TIM8)。

        由上表知道:除了 TIM2 和 TIM5 是 32 位的计数器,其他定时器是 16 位的。通用定时器和高级定时器其实也就是在基本定时器的基础上,添加了一些其他功能,如:输入捕获、输出比较、输出 PWM 和单脉冲模式等。而通用定时器数量较多,其特性也有一些的差异,但基本原理一样。

基本定时器

        先学习基本定时器框图,通过学习基本定时器框图会有一个很好的整体掌握,同时对之后的编程也会有一个清晰的思路。

① 时钟源

        基本定时器时钟挂载在 APB1 总线,所以它的时钟来自于 APB1 总线,但是基本定时器时钟不是直接由 APB1 总线直接提供,而是先经过一个倍频器。在 TIMPRE 位默认设置为 0 的情况下,当 APB1 的预分频器预的分频系数为 1 时,这个倍频器系数就为 1,即定时器的时钟源频率等于 APB1 总线时钟频率;当 APB1 的预分频器的预分频系数系数≥2 分频时,这个倍频器系数就为 2,即定时器的时钟源频率等于 APB1 总线时钟频率的两倍。

        我们在时钟设置函数 sys_stm32_clock_init 已经设置 APB1 总线时钟频率为 45MHz,预分频器的预分频系数为 2,所以定时器时钟源频率为90Mhz。

② 控制器

        控制器除了控制定时器复位、使能、计数等功能之外,还可以用于触发 DAC 转换。

③ 时基单元

        时基单元包括:预分频器寄存器(TIMx_PSC)计数器寄存器(TIMx_CNT)自动重载寄存器(TIMx_ARR) 。基本定时器的这三个寄存器都是 16 位有效数字,即可设置值范围是 0~65535。

        预分频器寄存器(TIMx_PSC)可以在运行过程中修改它的数值,新的预分频数值将在下一个更新事件时起作用。因为更新事件发生时,会把 TIMx_PSC 寄存器值更新到其影子寄存器中,这才会起作用。

        什么是影子寄存器?从框图上看,可以看到图 19.1.1.1 中的预分频器 PSC 后面有一个影子,
自动重载寄存器也有个影子,这就表示这些寄存器有影子寄存器。影子寄存器是一个实际起作用的寄存器,不可直接访问。预分频器寄存器只是起到缓存数据的作用,只有等到更新事件发生时,预分频器寄存器的值才会被自动写入其影子寄存器中,这时才真正起作用。

        自动重载寄存器及其影子寄存器的作用和上述同理。不同点在于自动重载寄存器是否具有缓冲作用还受到TIMx_CR1_ARPE位的控制,当该位置0时,ARR寄存器不进行缓冲,我们写入新的 ARR 值时,该值会马上被写入 ARR 影子寄存器中,从而直接生效;当该位置 1 时,ARR 寄存器进行缓冲,我们写入新的 ARR 值时,该值不会马上被写入 ARR 影子寄存器中,而是要等到更新事件发生才会被写入 ARR 影子寄存器,这时才生效。预分频器寄存器则没有这样相关的控制位,这就是它们不同点。

        更新事件的产生有两种情况,一是由软件产生,将 TIMx_EGR 寄存器位 UG 置 1,产生更新事件后,硬件会自动将 UG 位清零。二是由硬件产生,满足以下条件即可:计数器的值等于自动重装载寄存器影子寄存器的值

        基本定时器的计数器(CNT)是一个递增的计数器,当寄存器(TIMx_CR1)的 CEN位置1,即使能定时器,每来一个 CK_CNT 脉冲,TIMx_CNT 的值就会递增加 1。当 TIMx_CNT 值与 TIMx_ARR 的设定值相等时,TIMx_CNT 的值就会被自动清零并且会生成更新事件(如果开启相应的功能,就会产生 DMA 请求、产生中断信号或者触发 DAC 同步电路),然后下一个CK_CNT 脉冲到来,TIMx_CNT 的值就会递增加 1,如此循环。在此过程中,TIMx_CNT 等于TIMx_ARR时,我们称之为定时器溢出,因为是递增计数,故而又称为定时器上溢。定时器溢出就伴随着更新事件的发生。

基本定时器寄存器

⚫ 控制寄存器 1(TIMx_CR1

位 0CEN用于使能或者禁止计数器。还有位 7(ARPE)用于控制自动重载寄存器 ARR 是否具有缓冲作用,ARR 起缓冲作用,即只有在更新事件发生时才会把 ARR 的值写入其影子寄存器里;否则修改自动重载寄存器的值时,该值会马上被写入其影子寄存器中,从而立即生效。

⚫ DMA/中断使能寄存器(TIMx_DIER

位 0(UIE)用于使能或者禁止更新中断。位 8(UDE)用于使能或禁止更新 DMA 请求

⚫ 状态寄存器(TIMx_SR

位 0(UIF)是中断更新的标志位,当发生中断时由硬件置 1,然后就会执行中断服务函数,需要软件去清零,所以我们必须在中断服务函数里把该位清零。如果中断到来后,不把该位清零,那么系统就会一直进入中断服务函数。

通用/高级定时器下该寄存器存放中断标志位。比如更新中断标志位、捕获/比较中断标志位等。

⚫ 计数器寄存器(TIMx_CNT

 该寄存器位[15:0]就是计数器的实时的计数值。

⚫ 预分频寄存器(TIMx_PSC

该寄存器是 TIM6/TIM7 的预分频寄存器,比如我们要 9000 分频,就往该寄存器写入 8999。
注意这是 16 位的寄存器,写入的数值范围:0 到 65535,分频系数范围:1 到 65536。

⚫ 自动重载寄存器(TIMx_ARR) 

该寄存器可以由 ARPE 位设置是否进行缓冲。计数器的值会和 ARR 寄存器影子寄存器进行比较,当两者相等,定时器就会溢出,从而发生更新事件,如果打开更新中断,还会发生更新中断。

基本定时器总结

        STM32F4有2个基本定时器,TIM6 和 TIM7。

        基本定时器框图有三个部分,时钟源控制器时基单元。时基单元又有PSC预分频器CNT计数器ARR自动重装载寄存器

        基本定时器相关寄存器有6个:

        PSC 预分频寄存器,存储预分频值。预分频9000就写8999。

        CNT 计数器,存当前计数值。

        ARR 自动重装载寄存器。存储重装载值。计数9000就写8999。

        CR1 控制寄存器1。有ARPE位控制自动重装载预装载使能。有CEN位控制计数使能。

        DIER DMA/中断使能寄存器。有UDE位使能DMA更新请求。有UIE位使能中断。

        SR 状态寄存器。有UIF位记录中断更新标志,需手动清零否则持续进入中断。

通用定时器

        下面我们以 TIM2/TIM3/TIM4/TIM5 的框图为例来学习通用定时器框图,其他通用定时器的框图会有差异,因为内容比较多,大家学习了这里的框图再看 ST 官方手册其他的定时器框图就会比较容易理解。

        如上图,通用定时器的框图比基本定时器的框图复杂许多,为了方便介绍,我们将其分成六个部分讲解:

        ① 时钟源

        通用定时器时钟可以选择下面四类时钟源之一:
        1)内部时钟(CK_INT)
        2)外部时钟模式 1:外部输入引脚(TIx),x=1,2(即只能来自于通道 1 或者通道 2)
        3)外部时钟模式 2:外部触发输入(ETR)
        4)内部触发输入(ITRx):使用一个定时器作为另一定时器的预分频器
        通用定时器时钟源的设置方法如下表所示:

        内部时钟(CK_INT)
        STM32F4 系列的 TIM2/TIM3/TIM4/TIM5/ TIM6/TIM7/ TIM12/ TIM13/ TIM14 都是挂载在
APB1 总线上,这些定时器的内部时钟(CK_INT)实际上来自于 APB1 总线提供的时钟。但是这些定时器时钟不是由 APB1 总线直接提供,而是要先经过一个倍频器。在 HAL 库版本例程源码的 sys.c 文件中,系统时钟初始化函数 sys_stm32_clock_init 已经设置 APB1 总线时钟频率为45MHz,预分频器的预分频系数为 2,所以这些定时器时钟源频率为 90MHz。因为在 TIMPRE
位默认设置为 0 的情况下,当 APB1 预分频器的预分频系数≥2 分频时,挂载在 APB1 总线上的定时器时钟频率是该总线时钟频率的两倍。这个和基本定时器一样,可回顾基本定时器这部分内容。

        APB2 总线上挂载的通用定时器 TIM9/TIM10/TIM11,以及高级定时器 TIM1 和 TIM8,它们的情况是上面的描述是一样的,不同点是:定时器挂载的总线变成了 APB2,在系统时钟初始化函数 sys_stm32_clock_init 已经设置 APB2 总线时钟频率为 90MHz,预分频器的预分频系数为 2,所以上述的定时器时钟源频率为 180MHz

        外部时钟模式 1(TI1、TI2)
        外部时钟模式 1 这类时钟源,顾名思义时钟信号来自芯片外部。时钟源进入定时器的流程如下:外部时钟源信号→IO→TIMx_CH1(或者 TIMx_CH2),这里需要注意的是:外部时钟模式 1 下,时钟源信号只能从 CH1或者 CH2输入到定时器,CH3和 CH4都是不可以的。从 IO到 TIMx_CH1(或者 TIMx_CH2),需要我们配置 IO 的复用功能,才能使 IO 和定时器通道相连通。
        时钟源信号来到定时器 CH1 或 CH2 后,需要经过什么“关卡”才能到达计数器作为计数的时钟频率的,下面通过外部时钟模式 1 框图给大家解答。

        图 20.1.2 中是以 CH2(通道 2)为例的,时钟源信号到达 CH2 后,那么这里我们把这个时钟源信号用 TI2 表示,因为它只是个信号,来到定时器内部,那我们就按定时器内部的信号来命名,所谓入乡随俗。

        TI2 首先经过一个滤波器,由 ICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。

        接着经过边沿检测器,由 CC2P 位来设置检测的边沿,可以上升沿或者下降沿检测。然后经过触发输入选择器,由 TS[2:0]位来选择 TRGI(触发输入信号)的来源。可以看到图 20.1.2 中框出了 TI1F_ED、TI1FP1 和 TI2FP2 三个触发输入信号(TRGI)。TI1F_ED 表示来自于 CH1,并且没有经过边沿检测器过滤的信号,所以它是 CH1 的双边沿信号,即上升沿或者下降沿都是有效的。TI1FP1 表示来自 CH1 并经过边沿检测器后的信号,可以是上升沿或者下降沿。TI2FP2 表示来自 CH2 并经过边沿检测器后的信号,可以是上升沿或者下降沿。这里以 CH2 为例,那只能选择 TI2FP2。如果是 CH1 为例,那就可以选择 TI1F_ED 或者 TI1FP1。最后经过从模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。这里我们介绍的是外部时钟模式 1,所以 ECE 位置 0,SMS[2:0] = 111 即可。CK_PSC 需要经过定时器的预分频器分频后,最终就能到达计数器进行计数了。

        外部时钟模式 2(ETR)
        外部时钟模式 2,顾名思义时钟信号来自芯片外部。时钟源进入定时器的流程如下:外部时钟源信号→IO→TIMx_ETR。从 IO 到 TIMx_ETR,就需要我们配置 IO 的复用功能,才能使 IO 和定时器相连通。

        时钟源信号来到定时器 TIMx_ETR后,需要经过什么“关卡”才能到达计数器作为计数的时钟频率的,下面通过外部时钟模式 2 框图给大家解答。

        图 20.1.3 中,可以看到在外部时钟模式 2 下,定时器时钟信号首先从 ETR 引脚进来。
        接着经过外部触发极性选择器由 ETP 位来设置上升沿有效还是下降沿有效,选择下降沿有效的话,信号会经过反相器。然后经过外部触发预分频器,由 ETPS[1:0]位来设置预分频系数,系数范围:1、2、4、8。紧接着经过滤波器,由 ETF[3:0]位来设置滤波方式,也可以设置不使用滤波器。fDTS 由 TIMx_CR1 寄存器的 CKD 位设置。
        最后经过从模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。这里我们介绍的是外部时钟模式 2,直接把 ECE 位置 1 即可。CK_PSC 需要经过定时器的预分频器分频后,最终就能到达计数器进行计数了。

        内部触发输入(ITRx)
        内部触发输入是使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。下面以 TIM3 作为 TIM2 的预分频器为例,给大家介绍。

        上图中,TIM3 作为 TIM2 的预分频器,需要完成的配置步骤如下:
        1,TIM3_CR2 寄存器的 MMS[2:0]位设置为 010,即 TIM3 的主模式选择为更新(选择更新事件作为触发输出 (TRGO))。
        2,TIM2_SMCR 寄存器的 TS[2:0]位设置为 010,即 TIM2 使用 ITRx 作为内部触发(查内部触发连接表)。TS[2:0]位用于配置触发选择,除了 ITR2,还有其他的选择,详细描述如下图所示:

        上图中的触发选择中,我们在讲解外部时钟模式1的时候说过TI1F_ED、TI1FP1和TI2FP2,以及外部时钟模式 2 讲的 ETRF,它们都是属于外部的,其余的都是内部触发了。那么这内部触发都代表什么意思呢?大家打开《STM32F4xx 参考手册_V4(中文版).pdf》的 428 页,就可以找下面这个表。

        在步骤 2 中,TS[2:0]位设置为 010,使用 ITR2 作为内部触发,这个 ITR2 什么意思?由表20.1.3 可以知道,当从模式定时器为 TIM2 时,ITR2 表示主模式定时器就是 TIM3。这里只是TIM2~5 的内部触发连接情况,其他定时器请查看参考手册的相应章节。

        3,TIM2_SMCR 寄存器的 SMS[2:0] 置为 111,即 TIM2 从模式控制器选择外部时钟模式 1
        4,TIM3 和 TIM2 的 CEN 位都要置 1,即启动计数器
        定时器的时钟源这部分内容是非常重要的,因为这计数器工作的基础。虽然定时器有四类时钟源之多,但是我们最常用的还是内部时钟。

        ② 控制器

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

        ③ 时基单元

        时基单元包括:计数器(TIMx_CNT)预分频器寄存器(TIMx_PSC)自动重载寄存器(TIMx_ARR)。这部分内容和基本定时器基本一样的,大家可以参考基本定时器的介绍。

        不同点是:通用定时器的计数模式有三种:递增计数模式、递减计数模式和中心对齐模式;TIM2 和 TIM5 的计数器是 32 位的。递增计数模式在讲解基本定时器的时候已经讲过了,那么对应到递减计数模式就很好理解了。就是来了一个计数脉冲,计数器就减 1,直到计数器寄存器的值减到 0,减到 0 时定时器溢出,由于是递减计数,故而称为定时器下溢,定时器溢出就会伴随着更新事件的发生。然后计数器又从自动重载寄存器影子寄存器的值开始继续递减计数,如此循环。最后是中心对齐模式,字面上不太好理解。该模式下,计数器先从 0 开始递增计数,直到计数器的值等于自动重载寄存器影子寄存器的值减 1 时,定时器上溢,同时生成更新事件,然后从自动重载寄存器影子寄存器的值开始递减计算,直到计数值等于 1 时,定时器下溢,同时生成更新事件,然后又从 0 开始递增计数,依此循环。每次定时器上溢或下溢都会生成更新事件。计数器的计数模式的设置请参考 TIMx_CR1 寄存器的位 CMS 和位 DIR。

        上表的描述属于硬件更新事件发生条件,我们还可以通过 UG 位产生软件更新事件。  

        ④ 输入捕获

        图 20.1.1.1 中的第④部分是输入捕获,一般要和第⑤部分(公共部分)一起完成测量功能。
        TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。IO 端口通过复用功能与这些通道相连。配置好 IO 端口的复用功能后,将需要测量的信号输入到相应的 IO 端口,输入捕获部分可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常见的测量有:测量输入信号的脉冲宽度、测量 PWM 输入信号的频率和占空比等。

        下面简单说一下测量高电平脉冲宽度的工作原理,方便大家的理解:一般先要设置输入捕获的边沿检测极性,如:我们设置上升沿检测,那么当检测到上升沿时,定时器会把计数器 CNT 的值锁存到相应的捕获/比较寄存器 TIMx_CCRy 里,y=1~4。然后我们再设置边沿检测为下降沿检测,当检测到下降沿时,定时器会把计数器 CNT 的值再次锁存到相应的捕获/比较寄存器TIMx_CCRy里。最后,我们将前后两次锁存的 CNT的值相减,就可以算出高电平脉冲期间内计数器的计数个数,再根据定时器的计数频率就可以计算出这个高电平脉冲的时间。如果要测量的高电平脉宽时间长度超过定时器的溢出时间周期,就会发生溢出,这时候我们还需要做定时器溢出的额外处理。低电平脉冲捕获同理。
        上面的描述是第④部分输入捕获整体上的一个应用情况,下面我们来看第④部分的细节。
        当需要测量的信号进入通道后,需要经过哪些“关卡”?我们用图 20.1.7 给大家讲解。


        图 20.1.7 是图 20.1.1 第④部分通道 1 的“放大版”,这里是以通道 1 输入捕获为例进行介绍,其他通道同理。
        待测量信号到达 TIMx_CH1 后,那么这里我们把这个待测量信号用 TI1 表示,原因在讲解外部时钟模式 1 的时候说过,所谓“入乡随俗”。
        TI1 首先经过一个滤波器,由 ICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。
        fDTS 由 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 就是分频后的捕获信号。这个信号将会到达图 20.1.1 的第⑤部分(公共部分)。

        下面我们接着看图 20.1.1 的第⑤部分的“放大版”,如下图所示:

        图 20.1.8 中,灰色阴影部分是输出比较功能部分,讲到第⑥部分输出比较的时候再介绍。左边没有阴影部分就是输入捕获功能部分了。

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

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

        该部分需要结合第④部分(输入捕获)或者第⑥部分(输出比较)共同完成相应功能。

        ⑥ 输出比较

        图 20.1.1.1 中的第⑥部分是输出比较,一般应用是要和第⑤部分一起完成定时器输出功能。
TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。IO 端口通
过复用功能与这些通道相连。
        下面我们按照输出信号产生过程顺序给大家介绍定时器如何实现输出功能的?首先看到第⑤部分的“放大版”图,如下图所示:

        图 20.1.9 中,灰色阴影部分是输入捕获功能部分,前面已经讲过。这里我们看到右边没有阴影部分就是输出比较功能部分了。下面以通道 1 输出比较功能为例给大家介绍定时器如何实现输出功能的。
        首先程序员写 CCR1 寄存器,即写入比较值。这个比较值需要转移到对应的捕获/比较影子寄存器后才会真正生效。什么条件下才能转移?图 20.1.9 中可以看到 compare_transfer 旁边的与门,需要满足三个条件:CCR1 不在写入操作期间CC1S[1:0] = 0 配置为输出OC1PE 位置 0(或者 OC1PE 位置 1,并且需要发生更新事件,这个更新事件可以软件产生或者硬件产生)。
        当 CCR1 寄存器的值转移到其影子寄存器后,新的值就会和计数器的值进行比较,它们的比较结果将会通过第⑥部分影响定时器的输出。下面来看看第⑥部分通道 1 的“放大版”,如下图所示

        上图中,可以看到输出模式控制器,由 OC1M[3:0]位配置输出比较模式,oc1ref 是输出参考信号,高电平有效,为高电平时称之为有效电平,为低电平时称之为无效电平。它的高低电平受到三个方面的影响:OC1M[3:0]位配置的输出比较模式、第⑤部分比较器的比较结果、还有就是OC1CE 位配置的 ETRF 信号。ETRF 信号可以将 Oc1ref 电平强制清零,该信号来自 IO 外部。
        一般来说,当计数器的值和捕获/比较寄存器的值相等时,输出参考信号 oc1ref 的极性就会根据我们选择的输出比较模式而改变。如果开启了比较中断,还会发生比较中断。
        CC1P 位用于选择通道输出极性。
        CC1E 位置 1 使能通道输出。
        OC1 信号就会从 TIMx_CH1 输出到 IO 端口,再到 IO 外部。

通用定时器寄存器

        下面介绍 TIM2/TIM3/TIM4/TIM5 的几个与定时器中断相关且重要的寄存器,其他的通用定时器的寄存器会有一些差异,需对照参考手册相关章节。

⚫ 控制寄存器 1(TIMx_CR1

        ARPE 用于控制自动重载寄存器是否进行缓冲。

        CMS[1:0]位,中心对齐模式选择。00为边沿对齐模式,计数器根据方向位(DIR)递增或递减计数。另外有中心对齐模式1/2/3,计数器交替进行递增和递减计数,仅当计数器递增/递减/双边时,CCMRx的输出比较中断标志位才置1。Center-aligned mode selection

        DIR 位,用于控制定时器的计数方向。0递增,1递减。配置为中心对齐模式或编码器模式时,该为为只读。

        CEN 位,计数器使能。

        OPM 位,单脉冲模式。计数器发生更新事件时是否停止计数(CEN位清零)One-pulse mode。

⚫ 从模式控制寄存器(TIMx_SMCR

         SMS 位,从模式选择。其实就是选择计数器输入时钟的来源。0000禁止从模式,则 PSC 预分频器的时钟直接来源内部时钟(CK_INT),也就是定时器挂载的APB总线。

⚫ 捕获/比较模式寄存器 1/2(TIMx_CCMR1/2

        TIM2/TIM3/TIM4/TIM5 的捕获/比较模式寄存器(TIMx_CCMR1/2)。TIMx_CCMR1 控制 CH1 和 CH2,而 TIMx_CCMR2 控制CH3 和 CH4。

        该寄存器的有些位在输入/输出模式下,功能不一样。CCMR1/2的[7:0]和[15:8]分别对应通道1\2/3\4的配置。

        CCyS[1:0]用于通道的配置。

        00:通道配置为输出。01:通道配置为输入,ICy 映射到 TI1 上。02:通道配置为输入,ICy映射到 TI2 上。 03:通道配置为输入,ICy 映射到 TRC 上。此模式尽在通过SMCR寄存器选择内部触发输入时有效。

        比如我们要让 TIM3 的 CH4 输出 PWM 波,该寄存器的模式设置位 OC4M[2:0]就是对应着通道 4 的模式设置。总共可以配置 8 种模式,我们使用的是 PWM 模式 1 或者 PWM 模式 2,所以位 OC4M[2:0]设置为 110 或者 111。这两种 PWM模式的区别就是输出有效电平的极性相反。

⚫ 捕获/比较使能寄存器(TIMx_ CCER

        该寄存器控制着各个输入输出通道的开关和极性。该寄存器比较简单,要让 TIM3 的 CH4 输出 PWM 波,这里我们要使能 CC4E 位,该位是通道 4 输入/输出使能位,要想 PWM 从 IO 口输出,这个位必须设置为 1。CC4P 位是设置通道 4 的输出极性,我们默认设置 0。

 ⚫ 捕获/比较寄存器 1/2/3/4(TIMx_ CCR1/2/3/4)

捕获/比较寄存器(TIMx_ CCR1/2/3/4),该寄存器总共有 4 个,分别对应 4 个通道CH1~CH4。

        只有 TIM2 和 TIM5 用到的 CCRy 是 36 位,其他都是 18 位。 

        在输出模式下,捕获/比较寄存器影子寄存器的值与 CNT 的值比较,根据比较结果产生相应动作,利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的占空比了。

        如果通道 y 配置为输入,则 CCRy 存放上一次捕获的CNT的值;如果通道 y 配置为输出,则 CCRy 存放CCRy影子寄存器的预装载值。

通用定时器总结

通用定时器除了基本定时器的定时中断输入捕获输出比较输出 PWM单脉冲模式等。

        通用定时器框图有6个部分,分别是

        时钟源控制器时基单元输入捕获公共部分输出比较

时钟源总结

 通用定时器时钟源可以是:

        1)内部时钟,也就是APB总线时钟。
         除了 TIM9 ~ TIM11 和高级定时器 TIM1、TIM8 挂载在 APB2 总线上,2倍频后是 180MHz,其他 TIM 都是挂载在 APB1 总线上,2倍频后是 90MHz。

        2)外部时钟模式1,也即外部输入引脚(TIx),x=1,2(即只能来自于通道 1 或者通道 2)。

        3)外部时钟模式2,也即外部输入引脚ETR

        4)内部触发输入(ITRx):使用一个定时器作为另一定时器的预分频器。

        外部时钟模式1,也就是引脚 TIx 作为 TIM 时钟源时,外部时钟源信号首先到达 IO口,复用后进入定时器通道 TIMx_CH1(或者CH2),再经过滤波器如果信号来自通道1则可以选择不经过边沿检测器,直接双边沿触发,如果信号来自通道2,则必须经过边沿检测器,只能上升沿触发或者下降沿触发。最后经过 从模式选择器 SMCR判断设置的时钟源是什么,由定时器预分频器PSC分频后就能到达计数器CNT

        外部时钟模式2,也就是引脚 ETR 作为 TIM 时钟源时,外部时钟源信号先到达 IO口,复用后进入定时器的 ETR引脚口,接着进入 触发极性选择器 ETP,由 SMCR 的 ETP位来控制上升沿有效还是下降沿有效,下降沿有效的话信号会经过反相成上升沿。然后经过外部触发预分频器 ETPS,由SMCR的ETPS[1:0] 位来设置预分频系数。接着经过滤波器 ETF,由 ETF[3:0] 来设置滤波方式。最后经过从 模式选择器SMCR,由 ECE 位和 SMS[2:0]位来选择定时器时钟源,设置外部时钟模式 2,直接把 ECE 位置 1 即可。经过定时器预分频器 PSC 分频后,到达计数器CNT

内部触发输入,也就是ITRx作为时钟源,指的时使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。例如 TIM3 作为 TIM2 的预分频器,需要完成的配置步骤有:

1,TIM3_CR2 寄存器的 MMS[2:0] 设置为010,即 TIM3 的主模式选择为更新,也就是 TIM3 的更新事件作为 触发输出TRGO。

2,TIM2_SMCR 寄存器的 TS[2:0] 位根据 TIMx内部触发连接表 设置为对应的触发选择。

3,TIM2_SMCR 寄存器的 SMS[2:0] 位设置为111,即从模式控制器选择外部时钟模式1。

4,TIM3 和 TIM2 的 CEN 位都要置1,启动计数器。

附录:

控制器总结

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

时基单元总结

        通用定时器的时基单元和基本定时器类似,由预分频器PSC计数器CNT自动重装载寄存器ARR构成。

        不同的CNT的计数模式有递增、递减和中心对齐这三种。且TIM2和TIM5的计数器是32位,其他都是16位的。计数器的计数模式由CR1的CMS和DIR位决定。

输入捕获总结

        TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。

        输入捕获常用来测量PWM输入信号的频率、占空比。每个通道都有对应的CCRy寄存器,y=1~4,SMCR的ETP设置极性后,检测到相应的上升沿或者下降沿输入信号后,定时器会把计数器CNT的值锁存在CCR里,两次检测的差值可得到信号的计数差,根据时钟频率可得持续时间。

        总的来说,整个输入捕获的配置流程就是:

        开TIMx和对应GPIO口的时钟,配置IO口的复用功能输入。

        初始化TIMx,配置ARR和PSC等参数。

        通过CCMRy寄存器设置定时器为输入捕获模式。

        通过CCER寄存器使能捕获/比较。

        通过DIER寄存器使能捕获/比较更新中断。

        NVIC设置优先级,使能定时器中断。

        每次中断发生读取CCRy寄存器的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频服务网关的特点

一、视频服务网关的介绍 视频服务网关采用Linux操作系统,可支持国内外不同品牌、不同协议、不同设备类型监控产品的统一接入管理,同时提供标准的H5播放接口供其他应用平台快速对接,让您快速拥有视频集成能力。不受开发环境、跨系统跨平台等条…

数据分析思考

数据分析工作流程 在我的数据分析职业发展过程中,我从基础的数据提取工作开始,逐步深入到更为复杂和具有战略意义的领域。这包括构建和完善指标体系、设计风险预警模型,以及与多部门协作完成公司整体经营分析等工作。 在这个过程中&#xf…

Rust中的数据抓取:代理和scraper的协同工作

一、数据抓取的基本概念 数据抓取,又称网络爬虫或网页爬虫,是一种自动从互联网上提取信息的程序。这些信息可以是文本、图片、音频、视频等,用于数据分析、市场研究或内容聚合。 为什么选择Rust进行数据抓取? 性能:…

第22篇 Intel FPGA Monitor Program的使用<五>

Q:如何用Intel FPGA Monitor Program创建C语言工程并运行呢? A:总体过程与创建汇编语言工程类似,不同的是在指定程序类型时选择C Program。 后续用到DE2-115开发板的硬件如LED、SW和HEX等外设时,还需要将描述定义这些…

【机器学习】机器的登神长阶——AIGC

目录 什么是AIGC 普通用户接触AIGC网站推荐 通义千问 白马 普通用户如何用好AIGC 关键提示词的作用 AIGC的影响 就业市场: 教育领域: 创意产业: 经济活动: 社交媒体与信息传播: AIGC面临的挑战 什么是AIGC…

Vue68-路由简介

一、路由的应用:(单页面应用) 单页面应用:页面不刷新,但是路径会改变。 二、路由的原理: 2-1、多页面应用: 2-2、路由的相关概念 2-3、前端路由、后端路由 前端路由:你是什么路径…

transformers Model

☆ 问题描述 在 transformers 框架中,Model 模块是核心组件之一,提供了多种预训练模型及其相关功能,广泛应用于自然语言处理(NLP)任务。 ★ 解决方案 # 导入相关文件 from transformers import AutoConfig, AutoM…

【阅读论文】-- SWS:时空核密度可视化的复杂性优化解决方案

SWS: A Complexity-Optimized Solution for Spatial-Temporal Kernel Density Visualization 摘要1 引言2 预备知识2.1 STKDV 问题陈述2.2 基于范围查询的解决方案(RQS) 3 基于滑动窗口的解决方案(SWS)3.1 时间维度的滑动窗口3.2 …

【面试干货】throw 和 throws 的区别

【面试干货】throw 和 throws 的区别 1、throw1.1 示例 2、throws2.1 示例 3、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java中,throw和throws都与异常处理紧密相关,但它们在使用和含义上有明显的区别。…

ElementPlus组件与图标按需自动引入

按需自动引入组件 1. 安装ElementPlus和自动导入ElementPlus组件的插件 pnpm install element-plus pnpm install -D unplugin-vue-components unplugin-auto-import 2. vite.config.ts进行修改 import { defineConfig } from vite import vue from vitejs/plugin-vue // …

T200S4高清4路SDI采集卡

产品简介: 同三维T200S4 4路高清SDI采集卡,可以同时采集4路SDI高清信号,卡上有4个SDI接口1个SDI环出转接口,配件有: 1个转SDI转接线,PCI-E2.0 X4,分辨率最高可以达到1080P/60HZ,带SDK开发包&am…

计算机网络:应用层 - 文件传输协议 FTP 电子邮件

计算机网络:应用层 - 文件传输协议 FTP & 电子邮件 文件传输协议 FTP电子邮件 文件传输协议 FTP 文件传送协议 FTP(File Transfer Protocol),曾是互联网祝频讲解上使用得最广泛的文件传送协议。 其特点是:若要存取一个文件,…

fastadmin中$searchFields解析

在控制器或者模型中添加这个属性: protected $searchFields goods_name,goods_brand,category.name,manystoreShop.name,goods_model; 查询sql拼接就会自携带;原理如下:

算法基础精选题单 模拟 (个人题解)

前言: 从今天开始刷牛客上的这份题单,为暑假的牛客多校集训做准备,题单上一共有237道题,要想在集训开始前刷完难度还是很大的,但我一定会坚持下来,希望在这段时间内我能真正入门算法竞赛。接下来这三道题都…

操作系统实战(一)(PV经典问题之生产者与消费者)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀操作系统 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 进程互斥与同步 题目一 题目二 题…

在SQL中使用explode函数展开数组的详细指南

目录 简介示例1:简单数组展开示例2:展开嵌套数组示例3:与其他函数结合使用处理结构体数组示例:展开包含结构体的数组示例2:展开嵌套结构体数组 总结 简介 在处理SQL中的数组数据时,explode函数非常有用。它…

C#——装箱与拆箱详情

装箱与拆箱 装箱: 将值类型转换成引用类型的过程; 拆箱: 把引用类型转为值类型的过程,就是拆箱 装箱 拆箱

洗地机哪个品牌好?四大实力拔尖单品力荐

洗地机哪个品牌好呢?想必姐妹们肯定觉得保持家里清洁是非常重要的,但是每天打扫卫生真的会让人整个都要疯狂,这不,救星洗地机就能派上用场了,干垃圾湿垃圾统统都能一次清理干净。只需轻轻一推,就能把扫地、…

帝国cms批量取消文章审核-把已审核的文章改成未审核的方法

帝国cms很多人采集的时候,把文章弄成了审核过的文章,或者因为其他的原因,文章都是审核通过,为了seo又不能把全部文章放出来,所以需要把文章弄成未审核以下就是解决本问题的办法 首先来修改后台列表文件,自…

栈,队列,数组,链表

一.数据结构概述 数据结构是计算机底层存储,组织数据的方式。 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。 一般情况下,精心选择的数据结构可以来更高的运行或者存储效率。 二.学好数据结构三大…