
TIM定时器
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
当输入的时钟稳定可靠时,定时器即可模拟时钟。如 STM32 的定时器的基准时钟一般都是 72MHz,如果对 72MHz 计 72 次数,则每个数为
STM32 的定时器不仅具备基本的定时中断功能,还包含内外时钟源捕获、输出比较、编码器接口、主从触发模式等功能。
定时器类型
根据复杂度和应用场景,定时器被分为高级定时器、通用定时器、基本定时器三种类型。

定时器类型及功能
高级定时器一般用于控制三相无刷电机。
STM32F103C8T6
拥有 TIM1、TIM2、TIM3、TIM4 四个定时器。
基本定时器

基本定时器
`TIMxCLK`的主频一般是72MHz,即系统主频。 - 预分频器(PSC) 可以对72MHz的时钟进行预分频。计算公式如下:n 为预设的分频系数。
分频后即可实现对 72MHz 进行不同的计数的功能。如要实现
- 16 位计数器 (CNT)
对预分频后的计数时钟进行计数。计数时钟每有一个上升沿,计数器值加一。计数器为 16 位,故计数范围为 0~65535。 - 自动重装寄存器 (ARR)
存储我们写入的计数目标。当计数的值达到我们写入的目标时,产生一个中断信号,并清零计数器。中断信号随后发往 NVIC,进行下一步处理。这一流程被称为更新中短。除此之外,其还可以触发更新事件,即不触发中断,而触发内部其他电路的工作。
除了中断之外,定时器还可以设置为主模式触发 DAC,即不触发中断,直接将更新事件通过主模式映射到 TRGO,然后 TRGO 直接触发 DAC,一定程度上可以减轻 CPU 的负担。
通用定时器
通用定时器支持向上计数、向下计数、中央计数三种模式。
向上计数:计数器自增到目标值,再清零。
向下计数:计时器从目标值递减到零,再重置。
中央对齐:计时器从零开始递增到目标值,再从目标值递减到零。
通用定时器可以选择内部时钟或外部时钟。外部时钟分为 ETR 引脚的外部时钟输入 2;在需要定时器的级联时,使用外部时钟输入 1。
时基单元的时序
预分频器时序

预分频器的时序图
- CK_PSC:预分频器的输入时钟。 - CNT_EN:表明高电平计数器正常运行,低电平计数器停止运行。 - CNT_CNT:计数器时钟。 - 计数器寄存器:计数。在FC之后,计数器清零,可推断出ARR自动重装值即FC。 - 预分频缓冲器:在预分频器的值更新时,暂时储存预分频器的值;待计数周期结束后,再更新预分频器的值。 计数频率可以根据以下公式计算:计数器时序

计数器时序
CK_INT:内部时钟。
CNT_EN:时钟使能,高电平启动。
CK_CNT:计数器时钟。
计数器寄存器:在
CK_CNT
的每个上升沿自增,增至 0036 时发生溢出,同时清零,产生一个更新事件,同时置一个更新中断标志位 UIF,申请中断。中断响应后,需要在程序中手动清零。
计数器溢出频率:此外,还可以通过设置
ARPE=1
来启用影子寄存器,其作用与预分频器的缓冲寄存器类似,都是为了使值的变化与更新事件同步发生。
TIM 库函数

定时器基本结构
- `TIM_TimeBaseInitTypeDef`用于初始化的结构体,成员如下:
uint16_t TIM_Prescaler
:PSC 预分频器的值。uint16_t TIM_CounterMode
1 | TIM_CounterMode_Up |
TIM_Period
:ARR 自动重装器的值。TIM_ClockDivision
: 选择滤波器采样信号分频,可取TIM_CKD_DIVx
TIM_RepetitionCounter
:重复计数器的值,仅高级计数器。void TIM_DeInit(TIM_TypeDef* TIMx)
用于还原 TIM 配置。void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
用于配置时基单元。第一个参数选择要配置的定时器,第二个参数为初始化结构体。void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
给初始化结构体赋一个默认值。void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
运行控制,使能计数器。NewState
可选ENABLED
DISABLED
。void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
使能中断输出。TIM_IT
选择配置哪个?终端输出。时钟选择函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx)
选择内部时钟。没有时钟选择函数时,默认选择内部时钟。void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
选择外部时钟,第二个参数选择时钟源。void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter)
选择 TIx 捕获通道的时钟。TIM_TIxExternalCLKSource
选择具体的捕获引脚,TIM_ICPolarity
选择输入的极性,ICFilter
选择输入的滤波器。void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
选择从外部时钟模式 1 输入的时钟。TIM_ExtTRGPrescaler
为外部触发预分频器。void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter)
;
选择从外部时钟模式 2 输入的时钟。void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter)
单独配置 ETR 引脚的预分频器、极性、滤波器。
初始化后改变参数的函数
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
Prescaler
为要改变的预分频器值,TIM_PSCReloadMode
为要改变的预分频器工作模式。void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)
选择新的计数器模式。void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
配置自动重装寄存器是否需要预装。void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)
更改计数器/自动重装寄存器的值。uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx)
得到计数器/预分频器的值。
- Title: TIM定时器
- Author: SingleDog
- Created at : 2023-10-20 09:02:00
- Updated at : 2024-01-11 19:26:10
- Link: https://www.singledog233.top/stm32-TIM/
- License: This work is licensed under CC BY-NC-SA 4.0.