STM32 通用定时器
介绍
STM32微控制器中的通用定时器(General-purpose Timer)是一种功能强大的外设,用于生成精确的时间延迟、测量时间间隔、产生PWM信号等。通用定时器广泛应用于嵌入式系统中,例如电机控制、LED调光、信号捕获等场景。
STM32的通用定时器通常由以下几个部分组成:
- 计数器:用于计数时钟脉冲。
- 预分频器:用于降低输入时钟频率。
- 自动重装载寄存器:用于设置计数器的最大值。
- 捕获/比较寄存器:用于捕获输入信号或比较输出信号。
本文将逐步介绍STM32通用定时器的基本概念、配置方法以及实际应用。
通用定时器的基本工作原理
通用定时器的核心是一个16位或32位的计数器,它可以根据配置向上计数、向下计数或双向计数。定时器的时钟源可以来自内部时钟(如APB总线时钟)或外部时钟。
计数器模式
- 向上计数模式:计数器从0开始递增,直到达到自动重装载寄存器的值,然后重新从0开始计数。
- 向下计数模式:计数器从自动重装载寄存器的值开始递减,直到达到0,然后重新从自动重装载寄存器的值开始计数。
- 中心对齐模式:计数器先向上计数到自动重装载寄存器的值,然后向下计数到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) {
// 主循环
}
}
代码解释
- TIM_Period:设置为9999,表示计数器从0计数到9999,共10000个计数。
- TIM_Prescaler:设置为7199,表示将72MHz的时钟分频为10kHz(72MHz / (7199 + 1))。
- TIM_CounterMode:设置为向上计数模式。
- 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定时器的使用。
附加资源与练习
资源
练习
- 修改代码示例,使LED以不同的频率闪烁。
- 尝试使用通用定时器捕获外部信号的频率。
- 使用PWM模式控制LED的亮度,并实现渐变效果。