STM32 定时器链接
介绍
STM32微控制器中的定时器(Timer)是一个非常重要的外设,用于生成精确的时间延迟、测量时间间隔、生成PWM信号等。定时器可以独立运行,也可以与其他外设(如ADC、DMA等)协同工作,以实现更复杂的功能。
在STM32中,定时器通常分为以下几种类型:
- 基本定时器:用于简单的计时任务。
- 通用定时器:功能更强大,支持PWM输出、输入捕获等。
- 高级定时器:支持更复杂的控制功能,如死区时间控制、互补输出等。
本文将逐步介绍STM32定时器的基本概念、配置方法以及实际应用案例。
定时器的基本概念
定时器的工作原理
STM32的定时器本质上是一个计数器,它根据时钟信号进行计数。定时器的计数频率由时钟源决定,通常可以通过预分频器(Prescaler)来调整计数频率。当计数器达到设定值时,可以触发中断或产生其他事件。
定时器的寄存器
STM32的定时器由多个寄存器控制,主要包括:
- TIMx_CR1:控制寄存器1,用于配置定时器的基本功能。
- TIMx_PSC:预分频器寄存器,用于设置计数器的时钟分频。
- TIMx_ARR:自动重装载寄存器,用于设置计数器的最大值。
- TIMx_SR:状态寄存器,用于查看定时器的状态。
配置定时器
基本定时器配置
以下是一个简单的定时器配置示例,使用STM32的HAL库来配置一个基本定时器,使其每隔1秒触发一次中断。
c
#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 SystemClock_Config(void)
{
// 系统时钟配置代码
}
static void MX_GPIO_Init(void)
{
// GPIO初始化代码
}
static void MX_TIM2_Init(void)
{
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 预分频器设置为8399,将84MHz时钟分频为10kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 9999; // 自动重装载值设置为9999,计数器从0计数到9999,共10000个计数
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
// 定时器2中断处理代码
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED状态
}
}
代码解释
- 预分频器(Prescaler):
htim2.Init.Prescaler = 8399;
将84MHz的时钟分频为10kHz。 - 自动重装载值(Period):
htim2.Init.Period = 9999;
设置计数器从0计数到9999,共10000个计数。 - 中断回调函数:
HAL_TIM_PeriodElapsedCallback
是定时器溢出时的回调函数,用于处理定时器中断。
实际应用案例
PWM信号生成
PWM(脉宽调制)信号广泛应用于电机控制、LED调光等领域。STM32的定时器可以方便地生成PWM信号。
以下是一个使用TIM3生成PWM信号的示例:
c
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim3;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
while (1)
{
}
}
void SystemClock_Config(void)
{
// 系统时钟配置代码
}
static void MX_GPIO_Init(void)
{
// GPIO初始化代码
}
static void MX_TIM3_Init(void)
{
htim3.Instance = TIM3;
htim3.Init.Prescaler = 8399; // 预分频器设置为8399,将84MHz时钟分频为10kHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999; // 自动重装载值设置为999,计数器从0计数到999,共1000个计数
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 设置占空比为50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
代码解释
- PWM模式:
sConfigOC.OCMode = TIM_OCMODE_PWM1;
设置定时器为PWM模式。 - 占空比:
sConfigOC.Pulse = 500;
设置占空比为50%。
总结
STM32的定时器是一个功能强大的外设,可以用于多种应用场景,如时间延迟、PWM信号生成、输入捕获等。通过合理配置定时器的预分频器和自动重装载值,可以实现精确的时间控制。
提示
在实际项目中,定时器的配置和使用可能会更加复杂,建议参考STM32的参考手册和HAL库文档,以获取更多详细信息。
附加资源
练习
- 修改定时器的预分频器和自动重装载值,使LED的闪烁频率变为2Hz。
- 使用定时器生成一个占空比为25%的PWM信号,并观察输出波形。
警告
在进行实验时,请确保正确配置时钟和GPIO,以避免硬件损坏。