TIM简介
定时器类型
-
通用定时器(General-Purpose Timer)
-
- 功能:最常用的定时器类型,支持基本定时、计数、PWM(脉冲宽度调制)、输入捕获、输出比较等功能。
特点:通常为 16 位或 32 位计数器,可通过预分频器调节计数频率。支持向上 / 向下 / 中心对齐计数模式。可用于周期性中断(如定时采样、LED 闪烁)、生成 PWM 信号(如电机控制、灯光调光)。
举例:STM32 的 TIM2~TIM5(通用定时器)、STM32F1 的 TIM6~TIM7(基本定时器,功能简化版)。51 单片机的 T0、T1(8 位通用定时器)。
- 功能:最常用的定时器类型,支持基本定时、计数、PWM(脉冲宽度调制)、输入捕获、输出比较等功能。
-
高级定时器(Advanced Timer)
-
- 功能:在通用定时器基础上扩展了更多高级功能,支持复杂的电机控制和高精度同步。
特点:除通用定时器功能外,额外支持:互补 PWM 输出(带死区控制,用于三相电机驱动)。刹车功能(紧急情况下关闭 PWM 输出,保护硬件)。重复计数器(增强 PWM 周期控制精度)。
举例:STM32 的 TIM1、TIM8(高级定时器,常用于电机控制)。
- 功能:在通用定时器基础上扩展了更多高级功能,支持复杂的电机控制和高精度同步。
-
基本定时器(Basic Timer)
-
- 功能:功能最简单的定时器,仅支持基本定时和触发 DAC(数模转换)。
特点:无输入捕获、输出比较等扩展功能,仅用于定时中断或作为其他外设的触发源。
通常为 16 位计数器,结构简单,资源占用少。
举例:STM32 的 TIM6、TIM7(仅支持定时和 DAC 触发)。51 单片机的精简版定时器(部分型号)。
- 功能:功能最简单的定时器,仅支持基本定时和触发 DAC(数模转换)。
-
SysTick 定时器(系统滴答定时器)
-
- 功能:嵌入式处理器(如 ARM Cortex-M 系列)内核集成的简易定时器,属于 “内核外设”。
特点:通常为 24 位递减计数器,精度固定(由系统时钟驱动)。主要用于操作系统(如 RTOS)的任务调度(提供时间片),或作为简单的延时函数基础。
举例:STM32 所有型号均内置 SysTick 定时器。
- 功能:嵌入式处理器(如 ARM Cortex-M 系列)内核集成的简易定时器,属于 “内核外设”。
定时中断结构
定时器定时中断流程
// 1. 使能时钟(RCC)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 2. 配置时基单元
TIM_TimeBaseInitTypeDef TIM_InitStruct = {.TIM_Prescaler = 7199, // PSC=7199 → 72MHz/(7199+1)=10kHz计数频率.TIM_Period = 9999, // ARR=9999 → 10kHz→1Hz(1秒定时).TIM_CounterMode = TIM_CounterMode_Up, // 向上计数
};
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);// 3. 使能更新中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 4. 配置NVIC(中断优先级)
NVIC_InitTypeDef NVIC_InitStruct = {.NVIC_IRQChannel = TIM2_IRQn,.NVIC_IRQChannelCmd = ENABLE,.NVIC_IRQChannelPreemptionPriority = 0,.NVIC_IRQChannelSubPriority = 0,
};
NVIC_Init(&NVIC_InitStruct);// 5. 启动定时器
TIM_Cmd(TIM2, ENABLE); // 6. 中断服务函数(必须实现)
void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {// 定时中断触发逻辑(如翻转LED、累加计数)TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志}
}
定时器外部时钟配置流程
1. 引脚与时钟使能
// 使能 GPIO 和定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置 GPIO(以 PA0 作为 ETR 为例)
GPIO_InitTypeDef GPIO_InitStruct = {.GPIO_Pin = GPIO_Pin_0,.GPIO_Mode = GPIO_Mode_IN_FLOATING, // 浮空输入(或上拉/下拉,依外部电路定)
};
GPIO_Init(GPIOA, &GPIO_InitStruct);2. 外部时钟模式配置
// 选择外部时钟模式2(ETR引脚输入)
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, // 不分频 TIM_ExtTRGPolarity_NonInverted, // 非反相(高电平/上升沿有效)0x0F); // 滤波器参数(滤除毛刺)// 时基单元配置(分频、周期按需设置)
TIM_TimeBaseInitTypeDef TIM_InitStruct = {.TIM_Prescaler = 0, // 外部时钟已分频时,PSC可设0.TIM_Period = 9999, // 计数到10000触发更新.TIM_CounterMode = TIM_CounterMode_Up,
};
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);3. 使能定时器与中断
TIM_Cmd(TIM2, ENABLE); // 启动定时器计数// 若需中断,配置 NVIC + 使能更新中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn); // 使能定时器中断4. 中断服务函数
void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {// 外部脉冲计数满10000次的逻辑(如统计频率)TIM_ClearITPendingBit(TIM2, TIM_IT_Update); }
}