跳到主要内容

STM32 定时器概述

介绍

STM32微控制器中的定时器(Timer)是一个非常重要的外设模块,用于生成精确的时间延迟、测量时间间隔、生成PWM信号以及执行其他与时间相关的任务。定时器在嵌入式系统中应用广泛,例如控制LED闪烁、驱动电机、测量传感器信号等。

STM32的定时器模块非常灵活,支持多种工作模式,包括基本定时器、通用定时器和高级定时器。每种定时器都有其特定的功能和用途,但它们的基本工作原理是相似的。

定时器的基本概念

定时器的组成

STM32的定时器主要由以下几个部分组成:

  1. 计数器(Counter):定时器的核心部分,用于计数。计数器可以是向上计数、向下计数或双向计数。
  2. 预分频器(Prescaler):用于将输入时钟频率分频,从而调整计数器的计数速度。
  3. 自动重装载寄存器(Auto-reload Register):用于设置计数器的最大值。当计数器达到该值时,会触发溢出事件,并重新开始计数。
  4. 捕获/比较寄存器(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定时器的使用,建议尝试以下练习:

  1. 修改上述代码,使LED以不同的频率闪烁。
  2. 使用定时器生成一个占空比为50%的PWM信号,并观察输出波形。
  3. 使用输入捕获功能测量外部信号的频率。

附加资源