STM32CubeIDE新建项目过程记录备忘(七)通用定时器中断

  • 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通道。
  • 如果驱动一个三相无刷电机,必须用高级定时器TIM1TIM8,因为它支持互补输出和死区控制。

  • 详细对比:
类型主要用途通道数PWM编码器互补输出死区控制典型型号(F1/F4)
基本定时器时基、中断、DAC触发0TIM6、TIM7
通用定时器输入捕获、PWM、编码器1~4TIM2~TIM5
高级定时器电机控制、三相PWM4TIM1、TIM8

  • 简单总结:

基本定时器:只有计数,简单应用。
通用定时器:能PWM,能编码,没死区。
高级定时器:可用于电机驱动,带刹车,带死区。


  • 通用定时器中断的范例

本文是一个通用定时器中断的范例。

  • 确认APB1定时器的时钟频率:

这里的APB1定时器的时钟频率F_{t}=72MHz。

  • 设置定时器: 

 本例的定时器溢出时间设定为T_{out}=500ms(0.5s)。

T_{out}的计算公式:T_{out}=\frac{(Prescaler+1)*(Counter Period+1)}{F_{t}}

        已知F_{t}=72MHz,Prescaler这里就填7200-1=7199,将F_{t}=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();

 黄色齿轮、甲壳虫,输出代码并调试:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值