1. 框架中已初始化的定时器资源
定时器 | 类型 | 默认功能(需确认) | 中断潜力 |
TIM1 | 高级定时器 | 可能配置为PWM输出 | 支持复杂中断(刹车、编码器) |
TIM2 | 通用定时器 | 可能用作基础定时 | 最常用的定时中断源 |
TIM3 | 通用定时器 | 可能用作PWM/输入捕获 | 灵活的中断/事件生成 |
2. 启用定时中断的步骤
(1) 检查CubeMX配置(或手动修改)
确保定时器中断已使能:
// 在定时器初始化函数(如MX_TIM2_Init())中应有类似代码:
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7199; // 预分频值(72MHz/(7199+1)=10kHz)
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 9999; // 自动重装载值(10kHz/(9999+1)=1Hz中断)
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
Error_Handler();}
// 关键点:启用定时器中断HAL_TIM_Base_Start_IT(&htim2); // 启动并开启中断
(2) 实现中断回调函数
在main.c的USER CODE BEGIN 4区域添加:
// 定时器更新中断回调函数(1Hz触发示例)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) { // 判断是TIM2触发
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 翻转PA5(LED)
}}
(3) 启用NVIC中断(如果未自动配置)
在main.c中找到NVIC配置,确保定时器中断已开启:
// 在MX_TIM2_Init()附近添加HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(TIM2_IRQn);
3. 定时中断的典型应用场景
(1) 精准定时任务
// 每500ms执行一次任务void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
static uint32_t tick = 0;
if (htim->Instance == TIM2) {
tick++;
if (tick % 5 == 0) { // 500ms(假设中断100ms一次)
Read_Sensor(); // 读取传感器
}
}}
(2) PWM输入捕获(测量频率/占空比)
// 在MX_TIM3_Init()中配置为输入捕获模式后:void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
uint32_t pulse = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
// 计算脉冲宽度...
}}
(3) 硬件级实时控制
// 使用TIM1的刹车中断实现紧急停止void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM1) {
Emergency_Shutdown(); // 触发安全保护
}}
4. 关键注意事项
-
中断优先级
在main.c中调整优先级以避免冲突:
HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); // 优先级高于串口中断
-
中断频率计算
中断频率=系统时钟频率/[ Prescaler+1) * (Period+1) ]
Prescaler:预分频值;Period:ARR,自动重装载值,决定周期
示例:72MHz/(7199+1)/(9999+1) = 1Hz