定时器中断函数
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
TIM_ClearITPendingBit
用于清除 STM32定时器(TIM)的中断挂起标志位(即状态寄存器 SR
中的中断标志位)。通常在 中断服务程序(ISR) 中调用,以避免重复进入中断。
参数 | 类型 | 说明 |
---|---|---|
TIMx | TIM_TypeDef* | 定时器外设指针,如 TIM1 , TIM2 , TIM3 等。 |
TIM_IT | uint16_t | 要清除的中断标志,可以是以下值之一(或组合): • TIM_IT_Update (更新中断)• TIM_IT_CC1 (通道1捕获/比较中断)• TIM_IT_CC2 , TIM_IT_CC3 , TIM_IT_CC4 (通道2/3/4中断)• TIM_IT_Trigger (触发中断)• TIM_IT_Break (刹车中断,仅高级定时器TIM1/TIM8支持) |
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
函数作用:
用于 清除定时器(TIM)的状态标志位。一般用于清除定时器的中断发生时的更新标志位。
-
TIM_FLAG
:要清除的标志位(可以是多个标志位的组合):
标志宏 | 对应寄存器位 | 说明 |
---|---|---|
TIM_FLAG_Update | SR.UIF | 更新中断标志(计数器溢出/下溢,或软件触发更新事件) |
TIM_FLAG_CC1 | SR.CC1IF | 通道1捕获/比较匹配标志 |
TIM_FLAG_CC2 | SR.CC2IF | 通道2捕获/比较匹配标志 |
TIM_FLAG_CC3 | SR.CC3IF | 通道3捕获/比较匹配标志 |
TIM_FLAG_CC4 | SR.CC4IF | 通道4捕获/比较匹配标志 |
TIM_FLAG_Trigger | SR.TIF | 触发事件标志(由从模式控制器或外部触发信号产生) |
TIM_FLAG_Break | SR.BIF | 刹车输入事件标志(高级定时器TIM1/TIM8特有) |
TIM_FLAG_COM | SR.COMIF | COM事件标志(高级定时器TIM1/TIM8在输出比较模式下的回调事件) |
TIM_FLAG_CC1OF | SR.CC1OF | 通道1捕获溢出标志(连续捕获时未及时读取数据) |
TIM_FLAG_CC2OF | SR.CC2OF | 通道2捕获溢出标志 |
TIM_FLAG_CC3OF | SR.CC3OF | 通道3捕获溢出标志 |
TIM_FLAG_CC4OF | SR.CC4OF | 通道4捕获溢出标志 |
TIM_ClearITPendingBit
vs TIM_ClearFlag
函数 | 适用场景 | 底层操作 |
---|---|---|
TIM_ClearITPendingBit() | 专用于中断标志清除(需配合 TIM_ITConfig() 使能中断) | 操作 TIMx->SR 清除中断标志位 |
TIM_ClearFlag() | 通用标志清除(适用于所有标志,不限于中断) | 直接写 TIMx->SR 清除指定标志位 |
关键区别:
-
TIM_ClearITPendingBit
通常用于 中断服务程序(ISR),确保中断标志被正确清除,避免重复触发。 -
TIM_ClearFlag
可用于 任何场合(中断或非中断环境),清除状态标志。
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
用于使能或禁用指定的定时器中断。
时基单元
TIM_DeInit()
TIM_DeInit()
是 STM32 标准外设库(Standard Peripheral Library)中的一个函数,用于将定时器(TIM)寄存器恢复为复位默认值,相当于软件复位定时器。
void TIM_DeInit(TIM_TypeDef* TIMx);
-
参数:
TIMx
:定时器外设指针(如TIM2
,TIM3
等)。 -
返回值:无。
功能作用
-
将指定定时器的所有寄存器重置为上电默认值。
-
关闭定时器的所有功能(计数器、中断、DMA等)。
-
通常用于:
-
定时器重新配置前的清理
-
错误恢复
-
低功耗模式下关闭定时器
-
TIM_OCInitTypeDef
TIM_OCInitTypeDef
是 STM32 标准外设库中用于配置定时器输出比较(Output Compare, OC)功能的结构体,主要用于 PWM 生成、单脉冲输出等场景。
typedef struct {uint16_t TIM_OCMode; // 输出比较模式uint16_t TIM_OutputState; // 输出使能状态uint16_t TIM_OutputNState; // 互补输出使能(高级定时器)uint16_t TIM_Pulse; // 比较值(CCRx 寄存器值)uint16_t TIM_OCPolarity; // 输出极性uint16_t TIM_OCNPolarity; // 互补输出极性(高级定时器)uint16_t TIM_OCIdleState; // 空闲状态(高级定时器)uint16_t TIM_OCNIdleState; // 互补输出空闲状态(高级定时器)
} TIM_OCInitTypeDef;
TIM_OCPolarity--极性选择
#define TIM_OCPolarity_High ((uint16_t)0x0000)
#define TIM_OCPolarity_Low ((uint16_t)0x0002)
High:走0接口,输出的波形不反转;
Low:走1接口,波形取反,输出的波形反转;
通道初始化函数
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
需要使用哪个通道就调用哪个接口。
运行过程中修改占空比
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
注意,上面的函数本质上是设置CCR的值,从而改变占空比的,并不是直接改变占空比。
设置通道CCR预装载功能
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
这些函数用于配置定时器输出比较通道的预装载功能,主要控制CCRx
寄存器(捕获/比较寄存器)的更新方式。
-
TIMx:定时器外设指针(如TIM1, TIM2等)
-
TIM_OCPreload:
-
TIM_OCPreload_Enable
:启用预装载,新设置的CCR值下一个事件触发生效。 -
TIM_OCPreload_Disable
:禁用预装载,新设置的CCR值立刻生效。
-
预装载状态 | 寄存器访问 | 生效时机 | 适用场景 |
---|---|---|---|
启用 | 写入预装载寄存器 | 下一个更新事件(UEV) | 需要同步更新的PWM |
禁用 | 直接写入活动寄存器 | 立即生效 | 需要即时响应的控制 |
设置ARR预装载功能
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
参数 | 类型 | 描述 |
---|---|---|
TIMx | TIM_TypeDef* | 定时器外设指针(如 TIM1 , TIM2 等) |
NewState | FunctionalState | 预装载状态:ENABLE (启用)或 DISABLE (禁用) |
此函数用于 启用或禁用自动重装载寄存器(ARR)的预装载功能,通过控制 TIMx->CR1
寄存器的 ARPE
位实现。
-
预装载作用:确保对
TIMx->ARR
的修改在 更新事件(UEV) 后才生效,避免写入时干扰当前周期。
启用预装载(ENABLE
):
TIMx->CR1 |= TIM_CR1_ARPE; // 设置 CR1 的 ARPE 位
效果:写入 TIMx->ARR
的值会先存入 预装载寄存器,在下一个更新事件时才会加载到 影子寄存器(实际生效)。
-
适用场景:需同步修改多个寄存器(如 ARR 和 CCRx)或避免 PWM 周期抖动。
禁用预装载(DISABLE
):
TIMx->CR1 &= ~TIM_CR1_ARPE; // 清除 CR1 的 ARPE 位
-
效果:写入
TIMx->ARR
的值 立即生效(直接更新到影子寄存器)。 -
适用场景:需要快速响应 ARR 变化的场合(如动态调整频率)。
预装载机制示意图
写入 ARR 寄存器│├─ ARPE=1 ──┐│ ▼│ 预装载寄存器 ──(UEV)─→ 影子寄存器(实际生效)│└─ ARPE=0 ────→ 影子寄存器(直接生效)
更新PSC寄存器的值
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
TIM_PSCReloadMode:
* @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode* This parameter can be one of the following values:* @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event.* @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediately.
其实就是设置PSC预装载功能,新设置的PSC的值是立即生效,还是事件发生,即产生上升沿或者下降沿时生效。其实这两个值影响不大,除非需要极致要求。
获取/设置CNT的值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
PWMI配置
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);