STM32 HAL 定时器
介绍
在嵌入式系统中,定时器(Timer)是一个非常重要的外设,用于生成精确的时间延迟、测量时间间隔、生成 PWM 信号等。STM32 微控制器提供了多种定时器,包括基本定时器、通用定时器和高级定时器。通过 STM32HAL 库,我们可以轻松地配置和使用这些定时器。
本文将逐步介绍如何使用 STM32HAL 库配置定时器,并通过实际案例展示其应用。
定时器的基本概念
定时器本质上是一个计数器,它根据时钟信号递增或递减。STM32 的定时器可以配置为多种模式,包括:
- 向上计数模式:计数器从 0 开始递增,直到达到设定的值(自动重装载值),然后重新从 0 开始。
- 向下计数模式:计数器从设定的值开始递减,直到达到 0,然后重新从设定的值开始。
- 中央对齐模式:计数器先递增到设定的值,然后递减到 0,如此循环。
定时器还可以配置为生成中断或触发 DMA 请求,以便在特定事件发生时执行相应的操作。
配置定时器
1. 初始化定时器
首先,我们需要初始化定时器。以下是一个使用 STM32HAL 库初始化定时器的示例代码:
c
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 预分频器,将时钟频率降低
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)
{
// 初始化错误处理
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
// 时钟源配置错误处理
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
// 主从模式配置错误处理
}
}
2. 启动定时器
初始化完成后,我们需要启动定时器:
c
HAL_TIM_Base_Start(&htim2);
3. 处理定时器中断
如果我们需要在定时器溢出时执行某些操作,可以配置定时器中断:
c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
// 定时器溢出时的处理代码
}
}
实际案例:使用定时器生成 PWM 信号
PWM(脉宽调制)信号广泛应用于电机控制、LED 调光等场景。以下是一个使用 STM32HAL 库生成 PWM 信号的示例:
c
TIM_OC_InitTypeDef sConfigOC = {0};
void MX_TIM2_Init(void)
{
// 初始化定时器
MX_TIM2_Init();
// 配置 PWM 模式
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 5000; // 占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
// PWM 配置错误处理
}
// 启动 PWM
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
总结
通过本文,我们学习了如何使用 STM32HAL 库配置和使用定时器。定时器是嵌入式系统中非常重要的外设,掌握其使用方法对于开发复杂的嵌入式应用至关重要。
附加资源与练习
- 练习 1:尝试配置一个定时器,使其每 1 秒触发一次中断,并在中断处理函数中切换 LED 的状态。
- 练习 2:使用定时器生成一个频率为 1kHz、占空比为 50% 的 PWM 信号,并观察其波形。
提示
如果你在配置定时器时遇到问题,可以参考 STM32 的参考手册和 HAL 库的文档,这些资源提供了详细的寄存器描述和 API 说明。