STM32 拥有丰富的定时器资源,可用于精确计时、PWM 输出、输入捕获等功能。
定时器类型
- 基本定时器(TIM6/TIM7):简单计数
- 通用定时器(TIM2-TIM5):多功能定时器
- 高级定时器(TIM1/TIM8):带死区控制的复杂应用
定时器基础配置
TIM_HandleTypeDef htim2;
// 配置定时器2
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7199; // 预分频器
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数
htim2.Init.Period = 9999; // 自动重装载值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// 初始化定时器
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
// 启动定时器
HAL_TIM_Base_Start(&htim2);
定时器中断
// 配置定时器中断
HAL_TIM_Base_Start_IT(&htim2); // 启动定时器并使能中断
// 设置 NVIC 优先级
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
// 定时器中断服务函数
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim2);
}
// 定时器溢出回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
// 定时器2溢出处理
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
}
PWM 输出配置
TIM_OC_InitTypeDef sConfigOC = {0};
// 配置 PWM 通道
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式1
sConfigOC.Pulse = 500; // 占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
// 初始化 PWM 通道
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
// 启动 PWM 输出
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
// 动态调整占空比
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 750);
定时器计算公式
定时器时钟频率 = 系统时钟 / (预分频器 + 1)
定时器计数周期 = (自动重装载值 + 1)
定时时间 = 计数周期 / 定时器时钟频率
示例:系统时钟 72MHz,预分频器 7199,自动重装载值 9999
定时器时钟 = 72MHz / (7199 + 1) = 10kHz
计数周期 = 9999 + 1 = 10000
定时时间 = 10000 / 10kHz = 1秒
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。