STM32定时器详解(1)
@TOC
前言
本篇文章将带大家来学习STM32中的定时器,将会讲解到STM32中的高级定时器,通用定时器,基础定时器等内容。
一、STM32中定时器的分类
基本定时器(Basic Timers):
基本定时器是STM32中最简单的定时器类型之一。
通常用于生成简单的定时中断,如毫秒级的定时器。
典型的基本定时器包括TIM6和TIM7。
通用定时器(General-purpose Timers):
通用定时器是STM32中最常用的定时器类型之一。
可以用于多种定时、计数和PWM生成任务。
典型的通用定时器包括TIM1、TIM2、TIM3、TIM4等。
通用定时器通常具有更多的功能和比较灵活的配置选项,可以用于更复杂的定时和PWM任务。
高级定时器(Advanced Timers):
高级定时器是一种更复杂、更强大的定时器类型,通常用于需要更高精度和更复杂功能的应用。
典型的高级定时器包括TIM1和TIM8。
高级定时器通常具有更多的高级功能,如编码器接口、PWM死区控制等。
二、基础定时器
2.1基础定时器框图讲解
从基础定时器的硬件框图来看基础定时器的功能非常简单:
1.触发DAC
2.计数
基础定时器的时钟源来自内部时钟(Internal clock (CK_INT))
基础定时器是16bit的定时器,并且是向上计数的。
时间基准单元:
Counter Register (TIMx_CNT):
这是一个用于存储当前定时器计数值的寄存器。当定时器开始计数时,计数器的值会不断地递增,直到达到最大值(通常是 16 位定时器为 65535)。然后,计数器会根据设置的模式(例如向上、向下或向上/向下计数)重新开始计数。该寄存器的值可以通过软件读取,也可以用于设置定时器的起始计数值。
Prescaler Register (TIMx_PSC):
这是一个用于设置定时器的预分频器的寄存器。预分频器用于将定时器的时钟信号分频,以降低计数速度或调整计数频率。通过设置预分频器的值,可以改变定时器的时钟频率,从而影响定时器的计数速度和溢出时间。
Auto-Reload Register (TIMx_ARR):
这是一个用于存储定时器自动重载值的寄存器。自动重载值决定了定时器的周期。当定时器的计数器达到自动重载值时,定时器会产生一个更新事件(UEV),并重新开始计数。通常,自动重载值决定了定时器的周期性,即定时器溢出的时间间隔。
2.2基础定时器计数功能讲解
预分频器的功能:
预分频器用于将定时器的时钟信号分频,以降低计数速度或调整计数频率。这个分频比可以在 1 到 65536 之间进行设置。例如,如果设置分频比为 2,则定时器的时钟频率将减半。
预分频器的控制:
预分频器是由一个 16 位的计数器控制的,通过一个 1 位的寄存器进行控制。这意味着,可以通过调整这个 16 位计数器的值,来改变预分频器的分频比。寄存器(TIMx PSC register)用于设置预分频器的分频比,而计数器则用于实际的分频操作。
动态调整:
预分频器的分频比可以在运行时动态调整,因为预分频器的控制寄存器是被缓冲的。这意味着,即使在定时器正在运行时,也可以修改预分频器的分频比。修改后的分频比将在下一个更新事件(update event)时生效。更新事件通常发生在定时器计数器溢出时,或者通过软件触发。
缓冲:
关于预分频器的控制寄存器是被缓冲的意思是,新的预分频器比值不会立即生效,而是会等到下一个更新事件时才会生效。这种机制确保了对预分频器的更改不会中断正在进行的定时器计数过程。
通过上面这张图片我们可以印证:新的预分频器比值不会立即生效,而是会等到下一个更新事件时才会生效。
基础定时器(TIMx)的工作原理以及与计数器溢出、更新事件和寄存器更新相关的操作。
1.计数器工作原理:
计数器从0开始计数,一直累加到自动重载值(TIMx ARR 寄存器的内容),然后重新从0开始,并生成一个计数器溢出事件。这个循环过程一直持续。
2.更新事件:
更新事件可以在每次计数器溢出时生成,也可以通过设置 TIMx EGR 寄存器中的 UG 位来生成(通过软件或使用从模式控制器)。更新事件(UEV)用于触发对寄存器的更新操作。
3.禁用更新事件:
软件可以通过设置 TIMx CR1 寄存器中的 UDIS 位来禁用更新事件。这样做的目的是在写入新值到预加载寄存器时,避免更新影子寄存器。在这种情况下,直到 UDIS 位被写为 0 之前,不会发生更新事件,但是计数器和预分频器计数器都会重新从0开始(预分频率不变)。
4.URS 位的影响:
如果 TIMx CR1 寄存器中的 URS(更新请求选择)位被设置,那么通过设置 UG 位会生成一个更新事件 UEV,但 UlF 标志不会被设置,因此不会触发中断或 DMA 请求。
5.更新事件发生时的操作:
当更新事件发生时,所有相关寄存器都会被更新,并设置更新标志(UlF 位在 TIMx SR 寄存器中)。具体操作包括将预分频器的缓冲区重新加载为预加载值(TIMx PSC 寄存器的内容),以及更新自动重载阴影寄存器为预加载值(TIMx ARR 寄存器的内容)。
三、通用定时器
3.1通用定时器基本描述
1.16位自动重装向上计数器:
这些定时器具有16位的自动重装向上计数器,意味着它们可以从0计数到2^16 - 1,然后溢出并重新开始。
2.16位可编程分频器:
定时器配备有一个16位的可编程分频器。分频器允许你将计数时钟频率按1到65536之间的任意因子进行分频。重要的是,这个分频因子可以在运行时动态更改,即“on the fly”,提供了在调整计数速度方面的灵活性。
3.最多2个独立通道,用于:
输入捕获:此模式允许定时器在特定事件(如外部信号过渡)发生时捕获计数器的当前值。
输出比较:此模式使定时器能够根据计数器值和指定的比较值之间的预定义比较生成输出信号。
PWM生成(边沿对齐模式):支持脉冲宽度调制(PWM),提供了在边沿对齐模式下生成PWM信号的方法。
单脉冲模式输出:该模式用于基于触发事件生成单脉冲。
4.同步电路:
这些定时器配备了同步电路。这使得你可以使用外部信号控制定时器并将多个定时器进行同步。在需要多个定时器之间进行精确协调的场景中,这个功能非常有价值。
5.中断生成:
可以在各种事件上生成中断:
更新:在计数器溢出或计数器初始化(通过软件或内部触发)时触发。
触发事件:在计数器启动、停止、初始化或通过内部触发进行计数时生成。
输入捕获:可以在输入捕获事件上触发中断。
输出比较:可以根据输出比较事件生成中断。
3.2通用定时器硬件框图
从硬件框图中就可以很直观的看出来通用定时器相较于基础定时器多了一些什么功能。
首先是定时器的时钟:
通用定时器的时钟可以由:内部时钟,ITR0 ~ ITR3(内部触发信号),TIMx_CH1/2/3/4来提供。
还增加了以下功能:
多通道功能:
通用定时器通常支持多个独立通道,这些通道可以用于不同的目的,如输入捕获、输出比较和脉冲宽度调制(PWM)。这提供了更多的灵活性,使得定时器可以同时执行多种任务。
复杂的计时模式:
通用定时器可能支持更多复杂的计时模式,例如边沿对齐模式、中央对齐模式等。这些模式使得定时器更适用于不同类型的应用,如音频处理或电机控制。
动态分频器设置:
通用定时器通常允许在运行时动态地更改分频器的设置,而基础定时器可能不具备这种灵活性。动态分频器的设置使得可以根据应用的需求实时调整计时器的时钟频率。
同步功能:
通用定时器通常提供同步功能,允许多个定时器在同一时刻启动或停止,以确保它们之间的同步性。这对于需要协调多个定时器的应用非常重要。
更多中断选项:
通用定时器通常提供更多中断选项,可以在不同的事件上触发中断。这增加了在计时器运行时处理各种事件的能力。
四、高级定时器
4.1高级定时器基本描述
16位的向上、向下、向上/向下自动重装载计数器。
16位可编程预分频器,可以将计数器时钟频率按1至65536的因子进行分频(也可在运行时进行)。
最多支持4个独立通道,包括:
输入捕获
输出比较
PWM生成(边沿和中心对齐模式)
单脉冲模式输出
可编程死区的互补输出。
同步电路可以通过外部信号控制定时器,并将多个定时器连接在一起。
重复计数器可以在计数器周期达到给定次数后更新计时器寄存器。
Break输入可将定时器的输出信号置于复位状态或已知状态。
可以根据以下事件生成中断/DMA:
更新:计数器溢出/下溢,计数器初始化(通过软件或内部/外部触发)
触发事件:计数器启动、停止、初始化或通过内部/外部触发计数
输入捕获
输出比较
Break输入
支持增量(相位)编码器和霍尔传感器电路用于定位目的。
触发输入用于外部时钟或逐周期电流管理。
4.2高级定时器硬件框图
高级定时器相比于通用定时器多了一个定时器的时钟源提供:
ETR(External Trigger Input),外部触发的输入信号:可以统计外部触发信号
更多的特殊功能:高级定时器可能具有其他特殊功能,如编码器接口、死区控制、PWM生成的高级特性(如断路检测、震荡控制等)等,以满足特定应用的需求。
更精确的分辨率和同步性:高级定时器通常具有更高的分辨率,可以实现更精确的计时。此外,它们通常具有更强大的同步功能,可以与其他外部定时器和信号进行精确的同步操作。
更灵活的触发和中断机制:高级定时器通常支持更多的触发源和中断事件,以便在特定的计时条件满足时触发相应的操作和中断处理。
影子寄存器:高级定时器通常提供影子寄存器功能,可在定时器仍在计数时安全地更新定时器参数,以避免因更新参数而引起的错误计时。
总结
本篇文章主要讲解了STM32中定时器的分类和这些定时器的一些常用的基本功能。
- 点赞
- 收藏
- 关注作者
评论(0)