跳到主要内容

STM32 通用定时器

介绍

STM32微控制器中的通用定时器(General-purpose Timer)是一种功能强大的外设,用于生成精确的时间延迟、测量时间间隔、产生PWM信号等。通用定时器广泛应用于嵌入式系统中,例如电机控制、LED调光、信号捕获等场景。

STM32的通用定时器通常由以下几个部分组成:

  • 计数器:用于计数时钟脉冲。
  • 预分频器:用于降低输入时钟频率。
  • 自动重装载寄存器:用于设置计数器的最大值。
  • 捕获/比较寄存器:用于捕获输入信号或比较输出信号。

本文将逐步介绍STM32通用定时器的基本概念、配置方法以及实际应用。


通用定时器的基本工作原理

通用定时器的核心是一个16位或32位的计数器,它可以根据配置向上计数、向下计数或双向计数。定时器的时钟源可以来自内部时钟(如APB总线时钟)或外部时钟。

计数器模式

  1. 向上计数模式:计数器从0开始递增,直到达到自动重装载寄存器的值,然后重新从0开始计数。
  2. 向下计数模式:计数器从自动重装载寄存器的值开始递减,直到达到0,然后重新从自动重装载寄存器的值开始计数。
  3. 中心对齐模式:计数器先向上计数到自动重装载寄存器的值,然后向下计数到0,如此循环。

预分频器

预分频器用于将输入时钟频率分频,从而降低计数器的计数速度。例如,如果输入时钟频率为72MHz,预分频器设置为71,则计数器的时钟频率为1MHz(72MHz / (71 + 1))。

自动重装载寄存器

自动重装载寄存器用于设置计数器的最大值。当计数器达到该值时,会触发更新事件,并重新开始计数。


配置STM32通用定时器

以下是一个简单的示例,展示如何配置STM32的通用定时器以生成1秒的时间延迟。

c
#include "stm32f4xx.h"

void TIM2_Init(void) {
// 启用TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// 配置TIM2
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

// 启用TIM2更新中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

// 启用TIM2
TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
// 清除中断标志
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

// 在这里处理定时器中断
}
}

int main(void) {
TIM2_Init();

while (1) {
// 主循环
}
}

代码解释

  1. TIM_Period:设置为9999,表示计数器从0计数到9999,共10000个计数。
  2. TIM_Prescaler:设置为7199,表示将72MHz的时钟分频为10kHz(72MHz / (7199 + 1))。
  3. TIM_CounterMode:设置为向上计数模式。
  4. TIM_ITConfig:启用更新中断,当计数器达到自动重装载寄存器的值时触发中断。

实际应用案例

案例1:LED闪烁

使用通用定时器控制LED的闪烁频率。例如,配置定时器每500ms触发一次中断,在中断处理函数中切换LED的状态。

c
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

// 切换LED状态
GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
}
}

案例2:PWM信号生成

使用通用定时器生成PWM信号,控制电机的转速或LED的亮度。

c
void TIM3_PWM_Init(void) {
// 启用TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

// 配置TIM3
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

// 配置PWM模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 占空比为50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);

// 启用TIM3
TIM_Cmd(TIM3, ENABLE);
}

总结

STM32通用定时器是一种功能强大的外设,适用于多种应用场景。通过配置计数器、预分频器和自动重装载寄存器,可以实现精确的时间控制、PWM信号生成等功能。本文介绍了通用定时器的基本工作原理、配置方法以及实际应用案例,希望能帮助初学者快速上手STM32定时器的使用。


附加资源与练习

资源

练习

  1. 修改代码示例,使LED以不同的频率闪烁。
  2. 尝试使用通用定时器捕获外部信号的频率。
  3. 使用PWM模式控制LED的亮度,并实现渐变效果。