一、TIM定时器
STM32高级定时器实战:PWM、捕获与死区控制详解-CSDN博客
玩转STM32_rivencode的博客-CSDN博客
二、相关函数
1.TIM_TimeBaseInitTypeDef结构体讲解
typedef struct
{uint16_t TIM_Prescaler; // 预分频器,用于设置定时器计数频率uint16_t TIM_CounterMode; // 计数模式:向上、向下或中心对齐模式
// 自动重装载寄存器值,定时周期 = (TIM_Period + 1) * (Prescaler + 1) / Timer_Clockuint16_t TIM_Period; uint16_t TIM_ClockDivision; // 时钟分频(用于滤波器),对输入捕获/死区时间等有影响uint8_t TIM_RepetitionCounter; // 重复计数器(高级定时器)
} TIM_TimeBaseInitTypeDef;
2.基本、通用、高级定时器
类型 | 举例 | PWM | 输入捕获/输出比较 | 死区控制 | 互补输出 | 重复计数器 | 主从同步 | 中断/定时功能 |
---|---|---|---|---|---|---|---|---|
基本定时器 | TIM6、TIM7 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ 支持中断、定时 |
通用定时器 | TIM2~TIM5 | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ 支持多种模式 |
高级定时器 | TIM1、TIM8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ 功能最强大 |
分类 | 功能特性 | 常见用途 |
---|---|---|
基本定时器 | 只支持定时和中断 | 简单定时中断、DAC 触发 |
通用定时器 | 支持 PWM、输入捕获、输出比较等 | 电机控制、PWM、信号测量 |
高级定时器 | 通用功能 + 死区 + 互补 + 重复计数器等 | 高级电机控制、逆变器、功率控制 |
3.TIM_ClearFlag函数讲解
用于 清除定时器中断/状态标志位。它的本质就是将 TIMx->SR
中某些标志位置 0。
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_IT);
参数 | 说明 |
---|---|
TIMx | 要操作的定时器(如 TIM2 , TIM3 等) |
TIM_IT | 要清除的中断标志位,可以是以下值之一或它们的组合: - TIM_IT_Update (更新中断)- TIM_IT_CC1 ~ TIM_IT_CC4 (通道中断)- TIM_IT_Trigger (触发中断)- TIM_IT_COM (通讯中断) |
-
必须清除标志位,否则定时器中断会不断重复进入。
-
清除标志位 应该在中断处理函数中进行。
-
可以组合多个标志一起清除:
4.TIM_ITConfig函数讲解
开启或关闭指定的定时器中断源(如更新中断、捕获比较中断、触发中断等)。
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
参数名 | 含义 |
---|---|
TIMx | 要配置的定时器,例如 TIM1 ~ TIM17 (取决于芯片型号) |
TIM_IT | 中断类型 |
NewState | ENABLE 或 DISABLE ,表示启用或关闭该中断 |
宏定义 | 含义 |
---|---|
TIM_IT_Update | 更新中断(即计数器溢出) |
TIM_IT_CC1 | 捕获/比较 1 中断 |
TIM_IT_CC2 | 捕获/比较 2 中断 |
TIM_IT_CC3 | 捕获/比较 3 中断 |
TIM_IT_CC4 | 捕获/比较 4 中断 |
TIM_IT_Trigger | 触发中断 |
TIM_IT_COM | 通讯中断(高级定时器) |
TIM_IT_Break | 断路器中断(高级定时器) |
此函数 不会 配置 NVIC,必须另外调用 NVIC_Init()
注册中断号;
TIM_ITConfig()
会设置 TIMx->DIER
(DMA/中断使能寄存器) 中对应中断的使能位;
5.TIM_GetITStatus函数讲解
用于 查询某个定时器中断是否触发 的函数。
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
参数 | 说明 |
---|---|
TIMx | 要查询的定时器(如 TIM1 ~ TIM17 ,具体取决于芯片型号) |
TIM_IT | 要查询的中断源(如 TIM_IT_Update 、TIM_IT_CC1 等) |
🔁 返回值:
-
SET
:指定的中断标志已经被置位,即中断已经触发。 -
RESET
:指定的中断标志未被置位。
TIM_GetITStatus()
会检查定时器的以下两个寄存器:
-
TIMx->SR
:状态寄存器,包含中断标志位 -
TIMx->DIER
:中断使能寄存器,对应中断是否使能
⚠️ 只有当中断标志位被置位,并且该中断已使能时,函数才返回 SET
。
6.TIM_ClearITPendingBit函数讲解
用于 清除定时器中断挂起标志位(Pending Bit)
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
当某个定时器中断发生时,标志位(比如 UIF)会在 SR
寄存器中置位,表示该中断事件已发生。如果不清除该标志位,下一次进入中断时,标志位仍然为1,会导致反复进入中断,造成“死循环”现象。因此,需要在中断服务函数中调用此函数清除中断标志位。该函数本质上就是对 TIMx->SR
寄存器中某些位写 0
来清除挂起标志。
void TIM3_IRQHandler(void)
{// 判断是否为更新中断if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志位// 执行你的中断处理逻辑}
}
7.TIM_ClearITPendingBit与TIM_ClearFlag有何区别
其实重点在Flag和IT,前者是外设的状态标志,而后者是外设的中断标志。状态标志就是一个外设它有自身的一些标志位(Flag),来表明它处于什么状态。中断标志就是使能外设的中断后,每次发生一次中断,它会表明发生了什么样的中断,同样中断也有相应的标记。两者分别靠函数TIM_GetFlagStatus()和函数TIM_GetITStatus()来获取。
TIM_ClearITPendingBit一般用于 中断服务函数中,防止中断反复进入。
TIM_ClearFlag通常用于轮询模式下清除标志位。
可以看出两个函数的实现基本一致。