1. TIM定时器分类
STM32 的定时器主要分为以下几类:
- 高级定时器(Advanced TIM,TIM1/TIM8)
具备 PWM 生成、死区控制、互补输出等高级功能,适用于电机控制和功率转换应用。 - 通用定时器(General-purpose TIM,TIM2-TIM5/TIM9-TIM14)
支持输入捕获、输出比较、编码器接口等功能,适用于通用定时任务。 - 基本定时器(Basic TIM,TIM6/TIM7)
仅支持基本的计时功能,常用于 DAC 触发或作为简单的时间基准。 - 低功耗定时器(LPTIM)
适用于低功耗应用,支持超低功耗模式下的定时功能。
其中,高级定时器挂载在APB2,通用和基本定时器挂载在APB1。
2. TIM 主要功能
(1) 定时中断
- 可配置定时器在设定时间后触发中断,实现周期性任务,如系统心跳或 LED 闪烁。
(2) PWM(脉宽调制)
- 通过设置占空比,控制输出波形,用于电机控制、LED 亮度调节等。
(3) 输入捕获
- 记录外部信号的到达时间,例如测量信号频率或脉冲宽度。
(4) 输出比较
- 在特定时间点改变输出状态,实现精确的事件触发或波形生成。
(5) 编码器接口
- 读取增量式编码器的脉冲信号,进行位移或角度测量,广泛用于运动控制。
3. 基本TIM主从触发模式
STM32 的 TIM 定时器支持 主从模式(Master-Slave Mode),是一种高级功能,允许一个定时器(主)触发另一个定时器(从)或外设(如DAC)的操作。
4. TIM通用定时器
4.1 计数模式:
向上计数
向下计数
中央对齐
4.2 时钟源选择
时钟源 | 说明 | 典型应用 |
---|---|---|
内部时钟(CK_INT) | 由 APB1/APB2 总线时钟(PCLK)提供 | 普通定时、PWM 生成 |
外部时钟模式1(ETR) | 外部引脚 ETR 输入信号作为时钟源 |
频率测量、外部触发控制 |
外部时钟模式2(TIx) | TI1 或 TI2 输入信号作为时钟源 |
事件计数(如红外解码) |
内部触发(ITRx) | 由另一个定时器的输出作为时钟 | 多定时器同步(主从模式) |
编码器模式(TI1/TI2) | 两个输入通道用于检测正交编码器信号 | 旋转编码器测速与方向检测 |
4.3 输出比较
作用:输出PWM
模式编号 | 输出状态 | 描述 |
---|---|---|
OCM1 | Frozen | 当计数器与比较值匹配时,输出保持当前状态,不发生任何变化。 |
OCM2 | Active Level | 当计数器与比较值匹配时,输出设置为高电平(HIGH )。 |
OCM3 | Inactive Level | 当计数器与比较值匹配时,输出设置为低电平(LOW )。 |
OCM4 | Toggle | 当计数器与比较值匹配时,输出反转(Toggle )。 |
OCM5 | Set (PWM Mode) | 在 PWM 模式下,当计数器与比较值匹配时,输出设置为高电平(HIGH )。 |
OCM6 | Reset (PWM Mode) | 在 PWM 模式下,当计数器与比较值匹配时,输出设置为低电平(LOW )。 |
OCM7 | PWM Mode (Center-Aligned) | 在中心对齐模式下,输出在计数器达到比较值时设置高电平或低电平。 |
OCM8 | PWM Mode (Edge-Aligned) | 在边沿对齐模式下,输出在计数器与比较值匹配时产生一个脉冲(Pulse )。 |
- Frozen 模式:保持输出不变,适用于保持定时器输出稳定的情况。
- Active Level:输出设为高电平,适用于需要常开输出的情况。
- Inactive Level:输出设为低电平,适用于需要常闭输出的情况。
- Toggle:每次匹配都会切换输出状态,适用于需要周期性反转输出的场景。
- Set 和 Reset:在 PWM 模式下使用,用于控制输出波形的高低电平。
- PWM Mode (Center-Aligned) 和 PWM Mode (Edge-Aligned):适用于控制占空比的脉冲宽度调制,分别适用于中心对齐和边沿对齐模式。
4.4 输入捕获
5. TIM高级定时器
5.1 重复次数计数器
重复多次才会触发中断
5.2 输出比较模块的升级
以下功能主要用于电机控制
- 互补pwm
- 死区生成电路
- 刹车输入
6. 定时器配置流程
依次配置
- RCC开启
- 选择时基单元的时钟源
- 配置输出中断控制
- 配置NVIC,配置优先级,开启通道
- 使能计数器
- 书写中断函数
6.1 配置函数
/*
功能:此函数用于将指定的定时器 (TIMx) 进行硬件复位,将其配置恢复为默认状态。
参数:TIMx:指向目标定时器的指针,例如 TIM1, TIM2, 等。
*/
void TIM_DeInit(TIM_TypeDef* TIMx);
/*
功能:初始化定时器的基本时间配置,包括计数器的预分频器、计数器的自动重载值、计数模式等。
参数:
TIMx:指向目标定时器的指针。
TIM_TimeBaseInitStruct:一个指向 TIM_TimeBaseInitTypeDef 结构体的指针,包含初始化所需的时间基本配置参数。
*/
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
/*
功能:将 TIM_TimeBaseInitTypeDef 结构体初始化为默认值。通常在设置定时器时,先调用此函数清除结构体中的旧配置,然后再配置新的参数。
参数:TIM_TimeBaseInitStruct:指向 TIM_TimeBaseInitTypeDef 结构体的指针,用于保存定时器的时间基本配置。
*/
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
/*
功能:启用或禁用定时器。使能定时器后,计数器开始计数;禁用定时器则停止计数。
参数:
TIMx:指向目标定时器的指针。
NewState:新状态,ENABLE 启用定时器,DISABLE 禁用定时器。
*/
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
/*
功能:启用或禁用定时器的中断。根据传入的中断源,可以启用或禁用相应的中断。
参数:
TIMx:指向目标定时器的指针。
TIM_IT:指定定时器中断类型,例如 TIM_IT_Update。
NewState:新状态,ENABLE 启用中断,DISABLE 禁用中断。
*/
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
//时基选择
/*
功能:选择定时器的内部时钟源进行计时。
参数:TIMx:指向目标定时器的指针。
*/
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
/*
功能:配置定时器的外部输入触发源,以外部事件作为定时器的时钟输入。
参数:
TIMx:指向目标定时器的指针。
TIM_InputTriggerSource:外部触发源的配置。
*/
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
/*
功能:配置定时器的输入捕获 (Input Capture) 外部时钟源,包括时钟源、极性和滤波器配置。
参数:
TIMx:指向目标定时器的指针。
TIM_TIxExternalCLKSource:外部时钟源的配置。
TIM_ICPolarity:输入捕获极性配置(上升沿或下降沿触发)。
ICFilter:输入捕获信号的滤波器配置。
*/
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
/*
功能:配置定时器的外部触发模式 1,用于外部时钟源的配置。
参数:
TIMx:指向目标定时器的指针。
TIM_ExtTRGPrescaler:外部触发器预分频器配置。
TIM_ExtTRGPolarity:外部触发器极性配置。
ExtTRGFilter:外部触发信号的滤波器配置。
*/
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
/*
功能:配置定时器的外部触发模式 2,用于外部时钟源的配置。
参数:
TIMx:指向目标定时器的指针。
TIM_ExtTRGPrescaler:外部触发器预分频器配置。
TIM_ExtTRGPolarity:外部触发器极性配置。
ExtTRGFilter:外部触发信号的滤波器配置。
*/
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
/*
功能:配置定时器的外部触发源配置。
参数:
TIMx:指向目标定时器的指针。
TIM_ExtTRGPrescaler:外部触发器预分频器配置。
TIM_ExtTRGPolarity:外部触发器极性配置。
ExtTRGFilter:外部触发信号的滤波器配置。
*/
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
/*
功能:设置定时器的预分频器,用于调整定时器的计数速度。
参数:
TIMx:指向目标定时器的指针。
Prescaler:预分频器值,用于调整计数频率。
TIM_PSCReloadMode:预分频器重载模式,决定何时更新预分频器值(TIM_PSCReloadMode_Immediate 或 TIM_PSCReloadMode_Update)。
*/
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
/*
功能:配置定时器的计数模式,决定计数器是向上计数、向下计数还是双向计数。
参数:
TIMx:指向目标定时器的指针。
TIM_CounterMode:计数模式,通常有 TIM_CounterMode_Up (向上计数)、TIM_CounterMode_Down (向下计数) 和 TIM_CounterMode_CenterAligned (中心对齐模式)。
*/
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
/*
功能:配置定时器的自动重载寄存器 (ARR) 预加载,使得 ARR 的更新值在下一次计数周期开始时生效。
参数:
TIMx:指向目标定时器的指针。
NewState:新状态,ENABLE 启用预加载,DISABLE 禁用预加载。
*/
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
/*
功能:设置定时器计数器的当前值。
参数:
TIMx:指向目标定时器的指针。
Counter:要设置的计数器值。
*/
void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter);
/*
功能:设置定时器的自动重载值,定时器的计数器会在达到该值时自动重新加载并清零。
参数:
TIMx:指向目标定时器的指针。
Autoreload:自动重载值。
*/
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload);
/*
功能:获取定时器当前的计数值。
参数:
TIMx:指向目标定时器的指针。
*/
uint32_t TIM_GetCounter(TIM_TypeDef* TIMx);
/*
功能:获取定时器的当前预分频器值。
参数:
TIMx:指向目标定时器的指针。
*/
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
6.2 中断相关函数
/*
功能:检查指定定时器的中断是否被触发,即获取指定的中断标志位的状态。
参数:
TIMx:指向目标定时器的指针(例如 TIM1, TIM2 等)。
TIM_IT:要检查的定时器中断类型。常见的定时器中断类型包括:
TIM_IT_Update:更新中断标志(计数器溢出或自动重载值更新时触发)。
TIM_IT_CC1:捕获比较 1 中断标志。
TIM_IT_CC2:捕获比较 2 中断标志。
TIM_IT_CC3:捕获比较 3 中断标志。
TIM_IT_CC4:捕获比较 4 中断标志。
这些中断类型常见于定时器的配置中,当定时器达到特定条件时触发中断。
*/
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
/*
功能:清除指定的定时器中断挂起标志。定时器中断的挂起标志位在中断发生时会被设置,该函数用于手动清除该标志位,通常在处理中断后调用,确保中断不会重复触发。
参数:
TIMx:指向目标定时器的指针(例如 TIM1, TIM2 等)。
TIM_IT:要清除的定时器中断类型(与 TIM_GetITStatus 中使用的类型相同)。
例如,TIM_IT_Update、TIM_IT_CC1 等。
*/
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
6.3 外部时钟
知识点回顾
基础
STM32的定时器主要分为哪几类?它们之间有什么区别?
请简要描述STM32定时器的主要功能有哪些?
定时器的时钟源可以来自哪里?如何配置不同的时钟源?
通用TIM
通用定时器有哪几种计数模式?请分别描述它们的特点。
如何配置定时器的向上计数模式?请描述相关寄存器的设置。
什么是定时器的预分频器(Prescaler)和自动重装载寄存器(ARR)?它们的作用是什么?
请解释PWM输出的原理,并描述如何在STM32定时器上配置PWM输出。
什么是输出比较功能?如何配置定时器的输出比较模式?
主从触发
什么是定时器的主从模式?有什么应用场景?
请举例说明如何配置一个定时器作为主设备,另一个作为从设备?
定时器之间可以通过哪些信号进行同步?
高级TIM
高级定时器相比通用定时器有哪些额外的功能?
如何配置互补PWM输出?需要考虑哪些保护机制?
什么是死区时间?为什么在电机控制中需要设置死区时间?
中断配置
定时器中断配置的基本流程是什么?
定时器可以产生哪些类型的中断?如何使能这些中断?
在中断服务函数中,如何判断是哪个定时器中断源触发了中断?
实际应用
如何使用定时器测量外部脉冲的频率和占空比?
如何利用定时器实现精确的延时功能?
在低功耗应用中,如何配置定时器以最小化功耗?