STM32八股【5】----- TIM定时器

发布于:2025-04-02 ⋅ 阅读:(26) ⋅ 点赞:(0)

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) TI1TI2 输入信号作为时钟源 事件计数(如红外解码)
内部触发(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:每次匹配都会切换输出状态,适用于需要周期性反转输出的场景。
  • SetReset:在 PWM 模式下使用,用于控制输出波形的高低电平。
  • PWM Mode (Center-Aligned)PWM Mode (Edge-Aligned):适用于控制占空比的脉冲宽度调制,分别适用于中心对齐和边沿对齐模式。

4.4 输入捕获

5. TIM高级定时器

5.1 重复次数计数器
重复多次才会触发中断
5.2 输出比较模块的升级
以下功能主要用于电机控制

  • 互补pwm
  • 死区生成电路
  • 刹车输入

6. 定时器配置流程

江科大的图
依次配置

  1. RCC开启
  2. 选择时基单元的时钟源
  3. 配置输出中断控制
  4. 配置NVIC,配置优先级,开启通道
  5. 使能计数器
  6. 书写中断函数

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输出?需要考虑哪些保护机制?

什么是死区时间?为什么在电机控制中需要设置死区时间?
中断配置
定时器中断配置的基本流程是什么?

定时器可以产生哪些类型的中断?如何使能这些中断?

在中断服务函数中,如何判断是哪个定时器中断源触发了中断?
实际应用
如何使用定时器测量外部脉冲的频率和占空比?

如何利用定时器实现精确的延时功能?

在低功耗应用中,如何配置定时器以最小化功耗?