一、定时器概述
1.1 关于计时
在之前的文章中有介绍STM32芯片时钟体系,了解了芯片的工作频率,比如stmf407芯片的主频是168Mhz,代表着每秒钟能产生168000000次脉冲信号;
物质在1s内完成周期性变化的次数叫做频率,常用f表示。
周期与频率的关系:f=1/T。
周期,物体作往复运动或物理量作周而复始的变化时,重复一次所经历的时间。
我们在前面的代码里,有采用while循环计数来大致产生一段时间的间隔,但是非常不准确,那么如何得到一段精确的时间间隔呢?我们不可能随意去降低主频,所以肯定需要另外一种手段去控制时间。
定时器说白了就是个计数器,就像我们用心跳粗略估算时间一样,心脏跳动粗略可以认为是1s,那么我们计时60次心跳就过了60秒。
1.2 STM32芯片为什么需要精确衡量时间?
1)同步芯片内部的各个模块
芯片中的各个模块需要进行协调和同步以确保它们在正确的时间执行各自的操作,就像春晚一样,各个节目的时间需要掐的很准,不然就串台了,造成演出事故。所以需要通过一个准确的时间基准,来协调各个部件之间的先后处理关系,就像流水线一样。
2)同步数据传输
在数字系统中,数据的传输和处理通常是通过时钟信号来同步的。时钟信号作为一个参考点,指示了何时开始传输和接收数据,以确保在正确的时间间隔内完成数据传输。没有时钟信号的同步,数据传输可能会因为接收和发送方的时序不一致而产生错误。
3)节省能量
在许多芯片中,时钟信号还可以用于控制各个模块的工作周期。通过使不需要工作的模块进入休眠状态,可以减少功耗,延长电池寿命。
二、STM32——定时器
STM32F4 定时器分类(共14个):
高级定时器:TIME1 、TIME8
通用定时器: TIME2-TIME5,TIM9-TIM14
基本定时器: TIME6 、 TIME7
控制器上所有定时器都 是彼此独立的,不共享任何资源。就功能上来说通用定 时器包含所有基本定时器功能,而高级控制定时器包含通用定时器所有功能。所以高级控制定时 器功能繁多,但也是最难理解的。
1. 基本定时器
1)TIM6 和 TIM7 简介
2)主要特性
基本定时器(TIM6 和 TIM7)主要两个功能,第一就是基本定时功能,生成时基。第二就是 专门用于驱动数模转换器(DAC)。
基本定时器(TIM6 和 TIM7)的特性包括:
● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
● 用于触发 DAC 的同步电路
● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢
3)时基单元
时基单元包括:● 计数器寄存器 (TIMx_CNT)● 预分频器寄存器 (TIMx_PSC)● 自动重载寄存器 (TIMx_ARR)
(1)CK_PSC是定时器时钟TIMxCLK,经APB1预分频器后分频提供,我们的芯片为42Mhz,×2为84Mhz。
(2)定时器时钟经过PSC 预分频器之后,即CK_CNT,用来驱动计数器计数。

(3)计数器CNT 是一个16 位的计数器,向上,向下,向上/下计数模式(基本定时器只能递增计数),最大计数值为65535(2的16次方)。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。
(4)自动重装载寄存器ARR 是一个16位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
(5)时钟源
2.通用定时器
2.1 TIM2 到 TIM5
1)TIM2 到 TIM5 简介
通用定时器包含一个 16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。
它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)。 使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。
2)主要特性
通用定时器框图
(1)第一部分是定时器时钟源的选择
比基本定时器有了更多的选择方式,比较有特点的是支持外部时钟模式,这样就可以把N个定时器接一起串联起来,一个定时器的输出是另一个定时器的输入,不过用的比较少,最常用的还是选择内部时钟源。
计数器时钟可由下列时钟源提供:● 内部时钟 (CK_INT):如果禁止从模式控制器(TIMx_SMCR 寄存器中 SMS=000 ),则 CEN 位、 DIR 位( TIMx_CR1 寄存器中)和 UG 位( TIMx_EGR 寄存器中)为实际控制位,并且只能通过软件进行更改( UG 除外,仍自动清零)。当对 CEN 位写入 1 时,预分频器的时钟就由内部时钟 CK_INT 提供。● 外部时钟模式 1 :外部输入引脚 (TIx)当 TIMx_SMCR 寄存器中的 SMS=111 时,可选择此模式。计数器可在选定的输入信号上出现上升沿或下降沿时计数。● 外部时钟模式 2 :外部触发输入 (ETR) ,仅适用于 TIM2 、 TIM3 和 TIM4 。通过在 TIMx_SMCR 寄存器中写入 ECE=1 可选择此模式。计数器可在外部触发输入 ETR 出现上升沿或下降沿时计数。● 内部触发输入 (ITRx) :使用一个定时器作为另一个定时器的预分频器,例如可以将定时器配置为定时器 2 的预分频器。
(2)第二部分跟基本大致定时器一致,不过多了一些更灵活的功能。
高级和通用定时器在计数方式上有三种计数模式,分别为递增计数模式、递减计数模式和递增/递减(中心对齐) 计数模式。
- 递增计数模式:计数器从0 开始计数,每来一个CK_CNT 脉冲计数器就增加1,直到计数器 的值与自动重载寄存器ARR 值相等,然后计数器又从0 开始计数并生成计数器上溢事件,计数 器总是如此循环计数。
- 递减计数模式,计数器从自动重载寄存器ARR 值开始计数,每来一个CK_CNT 脉冲计数 器就减1,直到计数器值为0,然后计数器又从自动重载寄存器ARR 值开始递减计数并生成计数 器下溢事件,计数器总是如此循环计数。
- 中心对齐模式,计数器从0 开始递增计数,直到计数值等于(ARR-1) 值生成计数器上溢事 件,然后从ARR 值开始递减计数直到1 生成计数器下溢事件。然后又从0 开始计数,如此循环。 每次发生计数器上溢和下溢事件都会生成更新事件。
(3)第三部分是输入捕获
输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽和测量PWM 输入信号的频率和占空比这两种。
(4)第四部分是输出比较
输出比较就是通过定时器的外部引脚对外输出控制信号。每个捕获/比较通道均围绕一个捕获/比较寄存器(包括一个影子寄存器)、一个捕获输入阶 段(数字滤波、多路复用和预分频器)和一个输出阶段(比较器和输出控制)构建而成。
2.2 TIM9 到 TIM14
1)TIM9 到 TIM14 简介
2)TIM9 到 TIM14 主要特性

3)TIM10/TIM11 和 TIM13/TIM14 主要特性

3. 高级控制定时器
1) TIM1 和 TIM8 简介
2) TIM1 和 TIM8 主要特性

时基单元包括:● 计数器寄存器 (TIMx_CNT)● 预分频器寄存器 (TIMx_PSC):预分频器可对计数器时钟频率进行分频,分频系数介于 1 和 65536 之间。该预分频器基于TIMx_PSC 寄存器中的 16 位寄存器所控制的 16 位计数器。● 自动重载寄存器 (TIMx_ARR):自动重载寄存器是预装载的。● 重复计数器寄存器 (TIMx_RCR):重复计数器是自动重载类型;其重复率为 TIMx_RCR 寄存器所定义的值。

4.定时器设置结构体
(1) TIM_Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定TIMx_PSC
寄存器的值。可设置范围为0 至65535,实现1 至65536 分频。
(2) TIM_CounterMode:定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。
基本定时器只能是向上计数,即TIMx_CNT 只能从0 开始递增,并且无需初始化。
(3) TIM_Period:定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄
存器。可设置范围为0 至65535。
(4) TIM_ClockDivision:时钟分频,设置定时器时钟CK_INT 频率与数字滤波器采样时钟频率分
频比,基本定时器没有此功能,不用设置。
(5) TIM_RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容
易控制输出PWM 的个数。这里不用设置。
三、区别
3.1 优缺点
1)基本定时器
- 优点:
- 简单易用,适合基本的定时任务。
- 占用资源少,适合对资源要求较低的应用。
- 缺点:
- 功能有限,仅适用于基本的定时任务和中断生成。
- 缺乏一些高级功能,如PWM输出、编码器模式等。
2)通用定时器
- 优点:
- 具有丰富的功能和灵活性,可配置为多种工作模式。
- 支持多个计数器和更多的功能选项,如PWM输出、输入捕获、输出比较等。
- 适用于更复杂的定时、PWM生成、编码器等应用。
- 缺点:
- 相对于基本定时器,配置和使用稍显复杂。
- 在一些低功耗应用中可能存在功耗较高的问题。
3)高级定时器
- 优点:
- 具有更高级别的功能和性能,提供更高的精密度和灵活性。
- 适用于对定时精度要求较高的应用,如电机控制、音频处理等。
- 支持更复杂的应用,如三相电机控制、定位系统等。
- 缺点:
- 相对于通用定时器,更复杂,配置和使用难度较大。
- 在一些资源受限的应用中,可能会占用较多的资源。
3.2 应用场景
这些定时器在功能和特性上有所不同,适用于不同的应用场景。
1)基本定时器
- 基本定时器是STM32中最简单的定时器类型。
- 通常用于基本的定时测量或中断生成,比如产生固定时间间隔的中断。
- 通常只有一个计数器,功能相对较少。
- 适用于一些简单的定时任务,例如系统定时器、脉冲计数等。
2)通用定时器
- 通用定时器包括TIM2、TIM3、TIM4等,具有更丰富的功能。
- 通用定时器可以配置为多种工作模式,如定时器、输入捕获、输出比较等。
- 通用定时器通常有多个计数器和更多的功能选项,比如PWM输出、编码器模式等。
- 适用于更复杂的定时、PWM生成、编码器等应用。
3)高级定时器
- 高级定时器主要指TIM1定时器,具有更高级别的功能和性能。
- TIM1拥有更多的功能和精密度,通常用于需要更高精度的定时、PWM等应用。
- TIM1定时器通常用于高性能、精密度要求较高的应用,如电机控制、音频处理等。
在选择定时器类型时,需要根据具体的应用需求来决定使用哪种类型的定时器。如果只是简单的定时任务,基本定时器可能已经足够;如果需要更多功能和灵活性,通用定时器是一个不错的选择;而对于高性能和精密度要求更高的应用,则需要考虑使用高级定时器。
四、滴答定时器(SysTick)
4.1 什么是系统滴答定时器 ?
SysTick是一个24位的系统节拍定时器,具有自动重载和溢出中断功能,所有基于Cortex M3或Cortex M4处理器的微控制器都有这个定时器。
Systick定时器常用来做延时,或者用来做实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。
SysTick有4个寄存器:CTRL(控制和状态寄存器)、LOAD(自动重装载除值寄存器)、VAL(当前值寄存器)、CALIB(校准值寄存器)
4.2 主要特点和用途包括
1)灵活配置:SysTick 可以配置为多种模式,如自由运行、倒计时到零并产生中断,或倒计时到零然后停止。
2)中断生成:当 SysTick 定时器倒计时到零时,它会向 NVIC 生成中断请求,该请求可用于触发软件中的任务或操作。
3)时钟生成:在 RTOS 实现中,SysTick 定时器通常用作系统时钟。RTOS 内核设置 SysTick 定时器以在固定速率下生成周期性中断。这形成了 RTOS 中的时间跟踪和任务调度的基础。
4)系统时钟频率:SysTick 定时器的操作频率取决于系统时钟。通常可以配置,通常用于生成系统操作的固定时间基准,例如许多 RTOS 实现中的 1 毫秒节拍。
5)电源管理:SysTick 定时器可用于电源管理目的,定期唤醒微控制器从睡眠模式中执行必要的任务,然后返回睡眠以节省电源。
五、影子寄存器
5.1 什么是影子寄存器
影子寄存器是微控制器(包括STM32系列)中的一个概念,用于确保对某些特定寄存器的高效访问和同步更新。这些寄存器通常用于时间敏感的操作,比如定时器和PWM(脉冲宽度调制)控制等应用。影子寄存器的使用可以减少对寄存器访问的延迟和提高系统的性能。
STM32微控制器广泛使用影子寄存器,尤其在其定时器和PWM功能模块中。例如,在STM32的定时器模块中,自动重载寄存器(ARR)和捕获/比较寄存器(CCR)就有对应的影子寄存器。这些影子寄存器确保了定时器参数的平滑更新,无需担心中间状态可能导致的问题。用户在编程时需要根据具体的应用场景和STM32型号的参考手册来正确使用这些影子寄存器。
5.2 工作原理
1) 同步更新:
在某些情况下,直接修改寄存器的值可能会导致不稳定的行为或不准确的输出。例如,在定时器计数器中,直接改变定时器的周期可能会导致计数过程中的不一致。为了避免这种情况,可以首先将新的值写入影子寄存器中。然后,在合适的时刻(如当前计数周期结束时),影子寄存器中的值自动复制到实际的寄存器中,这样可以确保更新的原子性和一致性。
2)减少访问延迟:
对于某些高速操作,如PWM信号的生成,直接访问寄存器可能会引入不可接受的延迟。通过预先将值写入影子寄存器,然后在适当的时机批量更新到实际寄存器,可以减少每次访问带来的延迟。
5.3 应用场景
1)定时器控制:
在配置定时器周期或比较值时,使用影子寄存器可以确保在计数器溢出或比较匹配事件发生时,寄存器值的同步更新。
2)PWM信号生成:
在调整PWM的占空比时,通过影子寄存器可以无缝地在下一个PWM周期更新占空比值,避免在周期中间修改导致的PWM波形不稳定。