当前位置: 首页 > news >正文

TIM定时器

一、TIM定时器

STM32高级定时器实战:PWM、捕获与死区控制详解-CSDN博客

二、相关函数

1.TIM_TimeBaseInitTypeDef结构体讲解

typedef struct
{
  uint16_t TIM_Prescaler;         // 预分频器,用于设置定时器计数频率
  uint16_t TIM_CounterMode;       // 计数模式:向上、向下或中心对齐模式
// 自动重装载寄存器值,定时周期 = (TIM_Period + 1) * (Prescaler + 1) / Timer_Clock
  uint16_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中断类型
NewStateENABLEDISABLE,表示启用或关闭该中断
宏定义含义
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_UpdateTIM_IT_CC1 等)

🔁 返回值:

  • SET:指定的中断标志已经被置位,即中断已经触发。

  • RESET:指定的中断标志未被置位。

TIM_GetITStatus() 会检查定时器的以下两个寄存器:

  1. TIMx->SR:状态寄存器,包含中断标志位

  2. 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通常用于轮询模式下清除标志位。

可以看出两个函数的实现基本一致。

相关文章:

  • 跟着尚硅谷学vue-day3
  • 《 Scikit-learn与MySQL的深度协同:构建智能数据生态系统的架构哲学》
  • Python调用吉客云库存接口
  • 【学Rust写CAD】30 Argb结构乘Alpha256(Argb.rs 乘法重载)
  • 开发项目问题——moviepy报错两处
  • 【项目管理】第6章 信息管理概论 --知识点整理
  • MySQL基础 [六] - 内置函数+复合查询+表的内连和外连
  • 前端用户列表与后端分页协同设计
  • 算法-- js排序
  • 43常用控件_使用qrc文件管理资源
  • 多类型医疗自助终端智能化升级路径(代码版.上)
  • [docker] 简单操作场景
  • 【Java设计模式】第6章 抽象工厂模式讲解
  • Linux系统学习Day0——了解和熟悉Linux系统的远程终端登录和数据传输
  • 远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件
  • 批量转换图片颜色模型为 GMK/CMYK/灰度等
  • 08-Spring MVC 请求处理流程全解析
  • webrtc-stats
  • 3.神经网络
  • Linux系统(Ubuntu和树莓派)的远程操作练习
  • 五粮液董事长:茅台1935已脱离千元价位带,五粮液在千元价位已逐步摆脱其他竞品纠缠
  • 14岁女生瞒报年龄文身后洗不掉,法院判店铺承担六成责任
  • 中日有关部门就日本水产品输华问进行第三次谈判,外交部回应
  • 马上评|孩子亲近自然只能靠公园露营了吗
  • 马上评|演出服“穿过就退货”的闹剧不该一再重演
  • 上海乐高乐园明天正式开售年卡,下月开启试运营