-
STM32的定时器基础知识
在STM32 中,定时器被分为三大类:基本定时器(Basic Timer)、通用定时器(General-purpose Timer)和高级定时器(Advanced Timer)。它们的区别主要体现在功能复杂度、通道数量、PWM/编码器支持、死区控制、互补输出等方面。
1. 基本定时器(Basic Timer)
- 用途:提供时基(比如1ms中断)、触发DAC等。
- 特点:
- 没有输入/输出通道(不能PWM、不能捕获)。
- 只有计数器、预分频器、自动重载寄存器。
- 只能向上计数。
- 典型型号:TIM6、TIM7(在F1/F4系列中常见)。
2. 通用定时器(General-purpose Timer)
- 用途:PWM输出、输入捕获、输出比较、编码器接口。
- 特点:
- 有1~4个通道(TIM2~TIM5)。
- 支持向上、向下、中心对齐计数。
- 支持编码器接口(用于测速)。
- 不支持互补输出和死区控制。
- 典型型号:TIM2~TIM5(F1/F4系列)。
3. 高级定时器(Advanced Timer)
- 用途:电机控制、三相PWM、带死区控制的互补输出。
- 特点:
- 有4个通道,支持互补输出(CHxN)。
- 支持死区时间插入(防止上下桥臂直通)。
- 支持刹车输入(紧急停止PWM输出)。
- 支持重复计数器(用于控制PWM周期)。
- 典型型号:TIM1、TIM8(F1/F4系列)。
-
应用举例:
- 如果只需要一个1ms的定时中断,用基本定时器TIM6 就够了。
- 如果想控制一个舵机,用通用定时器TIM3的PWM通道。
- 如果驱动一个三相无刷电机,必须用高级定时器TIM1或TIM8,因为它支持互补输出和死区控制。
-
详细对比:
类型 | 主要用途 | 通道数 | PWM | 编码器 | 互补输出 | 死区控制 | 典型型号(F1/F4) |
---|---|---|---|---|---|---|---|
基本定时器 | 时基、中断、DAC触发 | 0 | ❌ | ❌ | ❌ | ❌ | TIM6、TIM7 |
通用定时器 | 输入捕获、PWM、编码器 | 1~4 | ✅ | ✅ | ❌ | ❌ | TIM2~TIM5 |
高级定时器 | 电机控制、三相PWM | 4 | ✅ | ✅ | ✅ | ✅ | TIM1、TIM8 |
-
简单总结:
基本定时器:只有计数,简单应用。
通用定时器:能PWM,能编码,没死区。
高级定时器:可用于电机驱动,带刹车,带死区。
-
通用定时器中断的范例
本文是一个通用定时器中断的范例。
-
确认APB1定时器的时钟频率:
这里的APB1定时器的时钟频率=72MHz。
-
设置定时器:
本例的定时器溢出时间设定为=500ms(0.5s)。
的计算公式:
=
已知=72MHz,Prescaler这里就填7200-1=7199,将
=72M代入上式,得出Counter Period+1=5000,Counter Period=4999。
如图:
auto-reload preload = Enable,意味着:
- 定时器当前周期不受干扰,新的周期值在下一个周期生效时使用
- 确保定时器周期变化的平稳过渡,避免产生半个周期等异常情况
其余的保持默认设置。
-
设置中断:
-
黄色齿轮生成代码:
-
创建应用文件:
为方便管理和项目移植,创建应用文件,用以存放定时器中断的代码。
-
tim_app.h的内容:
在头文件中声明了初始化函数和启动函数的原型
#ifndef INC_TIM_APP_H_
#define INC_TIM_APP_H_
#endif /* INC_TIM_APP_H_ */
#ifndef __TIM_APP_H
#define __TIM_APP_H
#include "stm32f1xx_hal.h" // 根据芯片系列调整
void MX_TIM2_Init_Custom(void); //初始化定时器中断函数原型
void TIM2_Start_500ms_IT(void); //启动定时器中断函数原型
#endif
-
tim_app.c的内容:
#include "tim_app.h"
#include "main.h" // 包含 PA2 的 GPIO 定义(如 GPIOA, GPIO_PIN_2)
extern TIM_HandleTypeDef htim2; // 由 CubeMX 生成的句柄
// 可选:如果你想封装初始化
void MX_TIM2_Init_Custom(void)
{
// CubeMX 已经生成 MX_TIM2_Init(),这里可以留空或调用它
}
// 启动 TIM2 中断
void TIM2_Start_500ms_IT(void)
{
HAL_TIM_Base_Start_IT(&htim2);
}
// 中断回调函数(在 stm32f1xx_it.c 中由 HAL_TIM_IRQHandler 调用)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2); // 翻转 PA2,这里可以是其他任何操作,或者调用别的已定义的应用层功能函数
}
}
解释:HAL_TIM_Base_Start_IT是系统内置的用于启动定时器基本功能并使能中断的函数。
main.c的调用:
TIM2_Start_500ms_IT();
黄色齿轮、甲壳虫,输出代码并调试: