目录

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

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 配置函数

c 复制代码
/*
功能:此函数用于将指定的定时器 (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 中断相关函数

c 复制代码
/*
功能:检查指定定时器的中断是否被触发,即获取指定的中断标志位的状态。

参数:

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

什么是死区时间?为什么在电机控制中需要设置死区时间?
中断配置

定时器中断配置的基本流程是什么?

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

在中断服务函数中,如何判断是哪个定时器中断源触发了中断?
实际应用

如何使用定时器测量外部脉冲的频率和占空比?

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

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

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
微信1532379424321 小时前
离线语音识别 ( 小语种国家都支持)可定制词组
嵌入式硬件
weixin_508821651 天前
1ms软延时,不用定时器,stm32
stm32·单片机·嵌入式硬件
月阳羊1 天前
【无人机】无人机PX4飞控系统高级软件架构
嵌入式硬件·架构·系统架构·无人机
weixin_508821651 天前
stm32 主频216MHz,写个ms延时函数,us延时函数
stm32·单片机·嵌入式硬件
华清远见IT开放实验室1 天前
【新书上市】《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》,高校教学推荐,STM32入门必读书籍!
stm32·单片机·嵌入式硬件·虚拟仿真·必读书籍·高校教学
智木芯语1 天前
【58】编程技巧:单片机编程命名规范
单片机·嵌入式硬件·嵌入式·#stm32·#stc8
捷配datasheet1 天前
OP2177运算放大器:高性能模拟信号处理的关键元件
嵌入式硬件·信号处理
逼子格1 天前
五种音频器件综合对比——《器件手册--音频器件》
嵌入式硬件·音视频·硬件工程师·硬件测试·电子器件·硬件笔试真题·音频器件
niuTaylor1 天前
STM32平衡车开发实战教程:从零基础到项目精通
stm32·单片机·嵌入式硬件