欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > STM32--TIM--函数

STM32--TIM--函数

2025/5/12 14:16:19 来源:https://blog.csdn.net/m0_60274660/article/details/147772411  浏览:    关键词:STM32--TIM--函数

定时器中断函数

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

TIM_ClearITPendingBit 用于清除 STM32定时器(TIM)的中断挂起标志位(即状态寄存器 SR 中的中断标志位)。通常在 中断服务程序(ISR) 中调用,以避免重复进入中断。

参数类型说明
TIMxTIM_TypeDef*定时器外设指针,如 TIM1TIM2TIM3 等。
TIM_ITuint16_t要清除的中断标志,可以是以下值之一(或组合):
• TIM_IT_Update(更新中断)
• TIM_IT_CC1(通道1捕获/比较中断)
• TIM_IT_CC2TIM_IT_CC3TIM_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_UpdateSR.UIF更新中断标志(计数器溢出/下溢,或软件触发更新事件)
TIM_FLAG_CC1SR.CC1IF通道1捕获/比较匹配标志
TIM_FLAG_CC2SR.CC2IF通道2捕获/比较匹配标志
TIM_FLAG_CC3SR.CC3IF通道3捕获/比较匹配标志
TIM_FLAG_CC4SR.CC4IF通道4捕获/比较匹配标志
TIM_FLAG_TriggerSR.TIF触发事件标志(由从模式控制器或外部触发信号产生)
TIM_FLAG_BreakSR.BIF刹车输入事件标志(高级定时器TIM1/TIM8特有)
TIM_FLAG_COMSR.COMIFCOM事件标志(高级定时器TIM1/TIM8在输出比较模式下的回调事件)
TIM_FLAG_CC1OFSR.CC1OF通道1捕获溢出标志(连续捕获时未及时读取数据)
TIM_FLAG_CC2OFSR.CC2OF通道2捕获溢出标志
TIM_FLAG_CC3OFSR.CC3OF通道3捕获溢出标志
TIM_FLAG_CC4OFSR.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:定时器外设指针(如 TIM2TIM3 等)。

  • 返回值:无。

功能作用

  • 将指定定时器的所有寄存器重置为上电默认值

  • 关闭定时器的所有功能(计数器、中断、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)

参数类型描述
TIMxTIM_TypeDef*定时器外设指针(如 TIM1TIM2 等)
NewStateFunctionalState预装载状态: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);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词