STM32 定时器概述
介绍
STM32微控制器中的定时器(Timer)是一个非常重要的外设模块,用于生成精确的时间延迟、测量时间间隔、生成PWM信号以及执行其他与时间相关的任务。定时器在嵌入式系统中应用广泛,例如控制LED闪烁、驱动电机、测量传感器信号等。
STM32的定时器模块非常灵活,支持多种工作模式,包括基本定时器、通用定时器和高级定时器。每种定时器都有其特定的功能和用途,但它们的基本工作原理是相似的。
定时器的基本概念
定时器的组成
STM32的定时器主要由以下几个部分组成:
- 计数器(Counter):定时器的核心部分,用于计数。计数器可以是向上计数、向下计数或双向计数。
- 预分频器(Prescaler):用于将输入时钟频率分频,从而调整计数器的计数速度。
- 自动重装载寄存器(Auto-reload Register):用于设置计数器的最大值。当计数器达到该值时,会触发溢出事件,并重新开始计数。
- 捕获/比较寄存器(Capture/Compare Register):用于捕获外部事件的时间或生成PWM信号。
定时器的工作模式
STM32定时器支持多种工作模式,包括:
- 定时器模式:用于生成精确的时间延迟。
- 输入捕获模式:用于测量外部信号的脉冲宽度或频率。
- 输出比较模式:用于生成PWM信号或触发其他事件。
- PWM模式:用于生成脉宽调制信号,常用于控制电机或LED亮度。
代码示例
以下是一个简单的STM32定时器配置示例,使用HAL库实现1秒的定时器中断。
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
HAL_TIM_Base_Start_IT(&htim2);
while (1)
{
// 主循环
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
// 定时器溢出中断处理
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED状态
}
}
static void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 预分频器,将84MHz时钟分频为10kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 9999; // 自动重装载值,10kHz计数到10000为1秒
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)
{
// 主从模式配置错误处理
}
}
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SystemClock_Config(void)
{
// 系统时钟配置代码
}
备注
在上述代码中,我们配置了TIM2定时器,使其每1秒触发一次中断,并在中断处理函数中切换LED的状态。
实际应用场景
1. LED闪烁控制
定时器可以用于控制LED的闪烁频率。通过配置定时器的周期和预分频器,可以精确控制LED的亮灭时间。
2. PWM信号生成
定时器可以生成PWM信号,用于控制电机的转速或LED的亮度。通过调整PWM的占空比,可以实现对输出信号强度的精确控制。
3. 输入捕获
定时器可以用于测量外部信号的脉冲宽度或频率。例如,可以使用输入捕获功能来测量超声波传感器的回波时间,从而计算距离。
总结
STM32的定时器是一个功能强大且灵活的外设模块,适用于多种与时间相关的应用场景。通过合理配置定时器的预分频器、计数器和自动重装载寄存器,可以实现精确的时间控制、PWM信号生成以及输入捕获等功能。
提示
为了进一步掌握STM32定时器的使用,建议尝试以下练习:
- 修改上述代码,使LED以不同的频率闪烁。
- 使用定时器生成一个占空比为50%的PWM信号,并观察输出波形。
- 使用输入捕获功能测量外部信号的频率。