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

TIM定时中断

目录

TIM(Timer)定时器

定时器类型

时序图

定时器初始化步骤(以 TIM2 为例)


本篇文章内容的前置知识为 EXTI 外部中断,如果不了解,可点击链接学习

EXTI 外部中断-CSDN博客

TIM(Timer)定时器

        定时器是一种硬件模块,用于对输入的时钟进行计数,并在计数值达到设定值时触发中断。它广泛应用于精确控制延迟和定时事件。
        在 STM32 微控制器中,定时器主要由 16 位计数器、预分频器和自动重装寄存器组成,形成时基单元。以 72MHz 的计数时钟为例,该定时器可以实现最大 59.65 秒的定时功能。定时器不仅具备基本的定时中断功能,还具有更多的高级功能,如内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等。
根据复杂度和应用场景,STM32 定时器可分为三种类型:
高级定时器:功能最强大,支持更多复杂的操作,常用于需要精细控制的场合。
通用定时器:具备较为广泛的应用场景,支持基本的定时和计数功能。
基本定时器:功能相对简单,通常用于需要单一、简易定时的应用。
通过不同类型的定时器,用户可以根据具体需求选择最适合的定时器进行使用。

定时器类型

类型编号总线功能
高级定时器TIM1、TIM8APB2拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器TIM2、TIM3、TIM4、TIM5APB1拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器TIM6、TIM7APB1拥有定时中断、主模式触发 DAC 的功能

STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
 

基本定时器框图

 一、时钟输入源(来自 RCC 的 TIMxCLK)
作用: 提供定时器运行所需的基础时钟。
说明: 这个时钟来自于系统总线(如 APB1),经过时钟树由 RCC 模块分配,频率一般为 72MHz。

 二、预分频器
输入: 时钟信号 CK_PSC
作用: 将主时钟频率进行“分频”处理,使得定时器以较慢的速度计数。
输出: 分频后的时钟信号 CK_CNT,用于驱动计数器。
配置方式: 程序可设置 PSC 寄存器值 n,则实际输出频率为:
CK_CNT = CK_PSC​ / (PSC+1)
CK_PSC是定时器 TIMx 的输入时钟频率

三、CNT 计数器
作用: 根据分频后产生的 CK_CNT 时钟进行计数。
特性:
是一个递增的计数器(有些定时器支持递减)
可设置自动重装值 ARR,到达该值后触发更新中断(UI)
计数方式可以配置:单次、循环

四、自动重装寄存器(ARR)
作用: 当 CNT 计数器计数到与 ARR 相等时,CNT 被清零,同时产生更新中断(UI)

五、触发控制器 & 控制器
作用:
响应更新事件(U)
生成触发输出(TRGO),可连接给 DAC 等模块使用(如触发一次模拟输出)
负责启动、停止、复位等功能管理
常用于: 定时触发 DAC、作为主模式触发源、产生中断

通用定时器框图

关于这个图的解释可以跳转下面的博客查看
STM32通用定时器详解-CSDN博客

高级定时器框图

时序图

预分频器时序

CK_PSC(预分频输入时钟)是原始输入时钟,频率较高。

CNT_EN 是定时器使能信号,拉高后定时器开始计数。

定时器时钟 = CK_CNT 是分频后的输出时钟,即 CNT 计数器用来递增的时钟。
由预分频器控制:CK_CNT = CK_PSC / (PSC + 1)

计数器寄存器(CNT)每当 CK_CNT 到来就加 1。
从 F7 → FC → 00 → 01 说明发生了溢出并回到 0。

UEV(更新事件)当 CNT 溢出时(FC → 00),触发更新事件,常用于中断、更新寄存器。

预分频控制寄存器(PSC)是用户写入的预分频值(这里从 0 改成 1,即 PSC=1 表示 ÷2)。
注意写进去不会马上生效

预分频缓冲器 在 UEV 到来时,PSC 的值才会传到这里 → 说明 PSC 是带缓冲的。

预分频计数器 控制 CK_CNT 的生成,如从 0→1→0→1……每满 PSC+1 次生成一个 CK_CNT 脉冲。

计数器时序

计数器每 2 个时钟脉冲加 1,溢出时会自动触发更新事件和中断标志(UIF)。

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
                           = CK_PSC / (PSC + 1) / (ARR + 1)
 

计数器无预装时序

在溢出前写入 TIMx_ARR = 36,由于 ARPE=0,这个新值马上就生效。
所以 CNT 一溢出就从 0 重新计数,符合新 ARR 值。

计数器有预装时序

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
// 若是 TIM1/TIM8 用 RCC_APB2

因为 ARPE=1,ARR 不会立刻生效,而是先存到影子寄存器里。
等到下一次更新事件(UEV)发生时,36 才从影子寄存器加载到真正的 ARR 中,开始生效。

定时器初始化步骤(以 TIM2 为例)

① 开启定时器时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
// 若是 TIM1/TIM8 用 RCC_APB2

② 选择时钟源

TIM_InternalClockConfig(TIM2);  // 选择内部时钟(其实默认就是内部时钟,可省略)

③ 配置时基单元

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 7199;                  // 预分频:PSC=7199,频率变为 10KHz
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式
TIM_TimeBaseInitStruct.TIM_Period = 9999;                     // 自动重装值 ARR=9999 → 1秒
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;      // 时钟分频(一般为1)
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;             // 重复计数器(高级定时器才有)TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);

④ 清除标志位并配置中断

TIM_ClearFlag(TIM2, TIM_FLAG_Update);            // 清除更新中断标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);       // 开启更新中断

⑤ 配置 NVIC

NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);

⑥ 启动定时器

TIM_Cmd(TIM2, ENABLE);

中断服务函数

void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 中断处理逻辑,如LED翻转、变量累加等}
}

定时器初始化函数表

函数名功能主要参数
RCC_APB1PeriphClockCmd()打开或关闭 APB1 总线上的外设时钟

RCC_APB1Periph_TIM2(要使能的外设时钟标识),

ENABLE/DISABLE(开或关)

TIM_InternalClockConfig()选择定时器的时钟源为内部时钟TIM2(指定哪个定时器)
TIM_TimeBaseInit()配置定时器的时基单元,包括计数模式、预分频、自动重装值等TIM2(指定定时器),&TIM_TimeBaseInitStruct(配置结构体指针)
TIM_ClearFlag()清除定时器的状态标志位,比如更新中断标志

TIM2(指定定时器),

TIM_FLAG_Update(要清除的标志位)

TIM_ITConfig()开启或关闭定时器的特定中断请求

TIM2(定时器),

TIM_IT_Update(更新中断),ENABLE/DISABLE。

NVIC_Init()配置 NVIC 中断优先级和使能&NVIC_InitStruct(中断配置结构体指针)
TIM_Cmd()启动或停止定时器计数

TIM2(定时器),

ENABLE/DISABLE

TIM_GetITStatus()检查指定的中断是否发生

TIM2(定时器),

TIM_IT_Update(更新中断)

TIM_ClearITPendingBit()清除指定的中断挂起位

TIM2(定时器),

TIM_IT_Update(更新中断)

结构体参数说明

TIM_TimeBaseInitTypeDef:

成员说明
TIM_Prescaler预分频值(PSC)
TIM_CounterMode计数方向(向上、向下、中心对齐模式)
TIM_Period自动重装值(ARR)
TIM_ClockDivision时钟分频因子(采样频率调整)
TIM_RepetitionCounter重复计数值(高级定时器才有用)

NVIC_InitTypeDef:

成员说明
NVIC_IRQChannel对应的中断通道(如 TIM2_IRQn)
NVIC_IRQChannelPreemptionPriority抢占优先级
NVIC_IRQChannelSubPriority响应优先级(同一抢占级别下)
NVIC_IRQChannelCmdENABLE 或 DISABLE


尚未完结

http://www.xdnf.cn/news/16137.html

相关文章:

  • 一些Avalonia与WPF内容的对应关系和不同用法
  • Java从入门到精通!第十一天(Java常见的数据结构)
  • 数据库设计mysql篇
  • 嵌入式学习-土堆目标检测(3)-day27
  • 【iOS】SideTable
  • 【深度解析】从AWS re_Invent 2025看云原生技术发展趋势
  • C语言(20250722)
  • 网络编程---TCP协议
  • 跨越语言壁垒!ZKmall开源商城多语言架构如何支撑电商全球化布局
  • libgmp库(GNU高精度算术库)介绍
  • mac实现sudo命切换node版本
  • netty的编解码器,以及内置的编解码器
  • OpenCV 零基础到项目实战 | DAY 1:图像基础与核心操作
  • LLC协议
  • mysql_innodb_cluster_metadata源数据库
  • Vue3 面试题及详细答案120道(31-45 )
  • Web3面试题
  • 智慧能源合同解决方案
  • 【接口自动化】pytest的基本使用
  • XML高效处理类 - 专为Office文档XML处理优化
  • Aspose.Cells 应用案例:法国能源企业实现能源数据报告Excel自动化
  • Python通关秘籍(五)数据结构——元组
  • Rocky Linux 9 快速安装 Node.js
  • 3.5 模块化编程实践
  • 【数据结构初阶】--栈和队列(二)
  • Python之格式化Conda中生成的requirements.txt
  • 我的第一个开源项目 -- 实时语音识别工具
  • 数据库表介绍
  • 算法提升之字符串回文处理-(manacher)
  • 自编码器表征学习:重构误差与隐空间拓扑结构的深度解析