TIM定时中断
目录
TIM(Timer)定时器
定时器类型
时序图
定时器初始化步骤(以 TIM2 为例)
本篇文章内容的前置知识为 EXTI 外部中断,如果不了解,可点击链接学习
EXTI 外部中断-CSDN博客
TIM(Timer)定时器
定时器是一种硬件模块,用于对输入的时钟进行计数,并在计数值达到设定值时触发中断。它广泛应用于精确控制延迟和定时事件。
在 STM32 微控制器中,定时器主要由 16 位计数器、预分频器和自动重装寄存器组成,形成时基单元。以 72MHz 的计数时钟为例,该定时器可以实现最大 59.65 秒的定时功能。定时器不仅具备基本的定时中断功能,还具有更多的高级功能,如内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等。
根据复杂度和应用场景,STM32 定时器可分为三种类型:
高级定时器:功能最强大,支持更多复杂的操作,常用于需要精细控制的场合。
通用定时器:具备较为广泛的应用场景,支持基本的定时和计数功能。
基本定时器:功能相对简单,通常用于需要单一、简易定时的应用。
通过不同类型的定时器,用户可以根据具体需求选择最适合的定时器进行使用。
定时器类型
类型 | 编号 | 总线 | 功能 |
---|---|---|---|
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发 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_IRQChannelCmd | ENABLE 或 DISABLE |
尚未完结