STM32标准库定时器相关函数详解

定时器复习入口:

STM32定时器知识点及标准库使用指南

目录

一、时钟使能函数

[1. 使能APB1总线定时器时钟(通用/基本定时器)](#1. 使能APB1总线定时器时钟(通用/基本定时器))

[2. 使能APB2总线定时器时钟(高级定时器)](#2. 使能APB2总线定时器时钟(高级定时器))

二、时基初始化函数

[1. 时基结构体初始化](#1. 时基结构体初始化)

三、PWM输出相关函数

[1. PWM模式初始化](#1. PWM模式初始化)

[2. 预装载寄存器控制](#2. 预装载寄存器控制)

[3. 自动重载寄存器预装载控制](#3. 自动重载寄存器预装载控制)

[4. 动态修改PWM占空比](#4. 动态修改PWM占空比)

四、输入捕获相关函数

[1. 输入捕获初始化](#1. 输入捕获初始化)

[2. 读取捕获值](#2. 读取捕获值)

五、中断控制函数

[1. 中断使能/禁用](#1. 中断使能/禁用)

[2. 中断标志位检查](#2. 中断标志位检查)

[3. 清除中断标志位](#3. 清除中断标志位)

六、计数器控制函数

[1. 定时器使能/禁用](#1. 定时器使能/禁用)

[2. 计数器值设置](#2. 计数器值设置)

[3. 计数器值读取](#3. 计数器值读取)

[4. 自动重载值设置](#4. 自动重载值设置)

七、高级定时器特殊函数

[1. 互补输出死区配置](#1. 互补输出死区配置)

[2. 主从模式配置](#2. 主从模式配置)

八、函数使用流程示例

九、总结summarize


STM32标准库(StdPeriph)为定时器操作提供了丰富的函数接口,涵盖时钟使能、初始化、配置、控制等各个环节。以下按功能分类介绍核心函数及其使用方法。

一、时钟使能函数

定时器的时钟由APB总线提供,使用前需先使能对应总线时钟。

1. 使能APB1总线定时器时钟(通用/基本定时器)

cpp 复制代码
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

参数 :

RCC_APB1Periph :指定要使能的APB1外设,RCC_APB1Periph_TIM2,RCC_APB1Periph_TIM6 等。

NewState :使能状态, ENABLE 或 DISABLE 。

使用场景 :用于TIM2-TIM7等挂载在APB1总线上的定时器。

2. 使能APB2总线定时器时钟(高级定时器)

cpp 复制代码
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

参数 :

RCC_APB2Periph :指定要使能的APB2外设,如 RCC_APB2Periph_TIM1, RCC_APB2Periph_TIM8 等。

NewState :使能状态, ENABLE 或 DISABLE 。

使用场景 :用于TIM1、TIM8等挂载在APB2总线上的高级定时器。

二、时基初始化函数

用于配置定时器的核心参数,如预分频器、自动重载值、计数模式等。

1. 时基结构体初始化

cpp 复制代码
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

参数 :

TIMx :定时器实例,如 TIM2 、 TIM6 等。

TIM_TimeBaseInitStruct :时基配置结构体,包含以下成员:

TIM_Prescaler :预分频器值(0-65535),实际分频系数为 TIM_Prescaler + 1 。

TIM_CounterMode :计数模式( TIM_CounterMode_Up / Down / CenterAligned1/2/3 )。

TIM_Period :自动重载值(0-65535),决定计数周期。

TIM_ClockDivision :时钟分割(通常设为0)。

TIM_RepetitionCounter :重复计数器(仅高级定时器使用)。

使用场景 :所有定时器使用前必须调用,配置核心计时参数。

三、PWM输出相关函数

用于配置和控制PWM输出功能。

1. PWM模式初始化

cpp 复制代码
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

参数 :

TIMx :定时器实例。

TIM_OCInitStruct :PWM配置结构体,包含以下成员:

TIM_OCMode :PWM模式( TIM_OCMode_PWM1 / PWM2 )。

TIM_OutputState :输出使能( TIM_OutputState_Enable / Disable )。

TIM_OutputNState :互补输出使能(仅高级定时器)。

TIM_Pulse :比较值(决定占空比)。

TIM_OCPolarity :输出极性( TIM_OCPolarity_High / Low )。

TIM_OCNPolarity :互补输出极性(仅高级定时器)。

TIM_OCIdleState :空闲状态输出(仅高级定时器)。

TIM_OCNIdleState :互补输出空闲状态(仅高级定时器)。

使用场景 :配置定时器的PWM输出通道(如 TIM_OC1Init 对应通道1)。

2. 预装载寄存器控制

cpp 复制代码
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

参数 :

TIMx :定时器实例。

TIM_OCPreload :预装载使能( TIM_OCPreload_Enable / Disable )。

作用 :使能PWM通道的预装载寄存器,确保占空比修改在更新事件时生效。

使用场景 :PWM配置中,通常与 TIM_ARRPreloadConfig 配合使用。

3. 自动重载寄存器预装载控制

cpp 复制代码
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
  • 参数 :

  • TIMx :定时器实例。

  • NewState :使能状态( ENABLE / DISABLE )。

  • 作用 :使能自动重载寄存器的预装载,确保ARR修改在更新事件时生效。

  • 使用场景 :PWM或定时任务中,需要平滑更新周期时使用。

4. 动态修改PWM占空比

cpp 复制代码
void TIM_SetComparex(TIM_TypeDef* TIMx, uint16_t Compare);
  • 参数 :

  • TIMx :定时器实例。

  • Compare :新的比较值(0到ARR之间)。

  • 作用 :实时修改PWM通道的占空比(如 TIM_SetCompare1 对应通道1)。

  • 使用场景 :需要动态调整PWM占空比的场景(如电机调速、亮度调节)。

四、输入捕获相关函数

用于配置和读取输入捕获功能,测量外部信号的频率或脉宽。

1. 输入捕获初始化

cpp 复制代码
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
  • 参数 :

  • TIMx :定时器实例。

  • TIM_ICInitStruct :输入捕获配置结构体,包含以下成员:

  • TIM_Channel :捕获通道( TIM_Channel_1 - 4 )。

  • TIM_ICPolarity :捕获触发极性( TIM_ICPolarity_Rising / Falling / BothEdge )。

  • TIM_ICSelection :输入选择( TIM_ICSelection_DirectTI / IndirectTI / TRC )。

  • TIM_ICPrescaler :捕获预分频( TIM_ICPSC_DIV1 / 2 / 4 / 8 )。

  • TIM_ICFilter :输入滤波器(0-15,值越大滤波效果越强)。

  • 使用场景 :配置定时器为输入捕获模式,用于信号测量。

2. 读取捕获值

cpp 复制代码
uint16_t TIM_GetCapturex(TIM_TypeDef* TIMx);
  • 参数 : TIMx :定时器实例。

  • 返回值 :捕获寄存器的值(16位)。

  • 作用 :读取指定通道的捕获值(如 TIM_GetCapture1 对应通道1)。

  • 使用场景 :输入捕获中断中读取捕获值,计算频率或脉宽。

五、中断控制函数

用于配置和管理定时器中断。

1. 中断使能/禁用

cpp 复制代码
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
  • 参数 :

  • TIMx :定时器实例。

  • TIM_IT :中断类型(如 TIM_IT_Update / CC1 / Trigger 等)。

  • NewState :使能状态( ENABLE / DISABLE )。

  • 作用 :使能或禁用指定的定时器中断。

  • 使用场景 :需要定时器中断时调用(如定时任务、输入捕获触发)。

2. 中断标志位检查

cpp 复制代码
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
  • 参数 :

  • TIMx :定时器实例。

  • TIM_IT :中断类型。

  • 返回值 :中断标志位状态( SET / RESET )。

  • 作用 :检查指定中断是否触发。

使用场景 :中断服务函数中判断中断来源。

3. 清除中断标志位

cpp 复制代码
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
  • 参数 :

  • TIMx :定时器实例。

  • TIM_IT :中断类型。

  • 作用 :清除指定的中断标志位。

  • 使用场景 :中断服务函数末尾调用,避免重复触发中断。

六、计数器控制函数

用于直接操作定时器计数器。

1. 定时器使能/禁用

cpp 复制代码
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
  • 参数 :

  • TIMx :定时器实例。

  • NewState :使能状态( ENABLE / DISABLE )。

  • 作用 :启动或停止定时器计数。

  • 使用场景 :所有定时器配置完成后调用,启动计数。

2. 计数器值设置

cpp 复制代码
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
  • 参数 :

  • TIMx :定时器实例。

  • Counter :要设置的计数器值。

  • 作用 :手动设置计数器的当前值。

  • 使用场景 :需要从特定值开始计数时使用。

3. 计数器值读取

cpp 复制代码
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
  • 参数 : TIMx :定时器实例。

  • 返回值 :当前计数器值(16位)。

  • 作用 :读取计数器的实时值。

  • 使用场景 :需要获取当前计数值时使用(如计算时间差)。

4. 自动重载值设置

cpp 复制代码
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
  • 参数 :

  • TIMx :定时器实例。

  • Autoreload :新的自动重载值。

  • 作用 :动态修改自动重载值(需配合预装载使能)。

  • 使用场景 :需要动态调整定时周期时使用。

七、高级定时器特殊函数

高级定时器(TIM1/TIM8)特有的功能函数。

1. 互补输出死区配置

cpp 复制代码
void TIM_BDTRConfig(TIM_TypeDef* TIMx, uint16_t TIM_OSSRState, uint16_t TIM_OSSIState, 
                    uint16_t TIM_LOCKLevel, uint16_t TIM_DeadTime, 
                    uint16_t TIM_Break, uint16_t TIM_BreakPolarity, 
                    uint16_t TIM_AutomaticOutput);
  • 参数 :

  • TIMx :高级定时器实例( TIM1 / TIM8 )。

  • TIM_DeadTime :死区时间(0-255),单位与定时器时钟有关。

  • 其他参数:刹车、锁定级别等配置。

  • 作用 :配置高级定时器的死区时间和刹车功能,用于电机控制等场景。

  • 使用场景 :需要互补PWM输出时调用(如三相电机驱动)。

2. 主从模式配置

cpp 复制代码
void TIM_MasterConfigSynchronization(TIM_TypeDef* TIMx, TIM_MasterInitTypeDef* TIM_MasterInitStruct);
  • 参数 :

  • TIMx :定时器实例。

  • TIM_MasterInitStruct :主从模式配置结构体。

  • 作用 :配置定时器为主模式,向其他定时器输出触发信号。

  • 使用场景 :多定时器同步或级联时使用。

八、函数使用流程示例

以通用定时器PWM输出为例,完整流程如下:

cpp 复制代码
1.使能时钟 :
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  // 使能TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 使能GPIOA时钟

2.配置GPIO :
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;  // TIM3_CH1
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;  // 复用推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

3.初始化时基 :
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);  // 复位结构体
TIM_TimeBaseStruct.TIM_Prescaler = 71;  // 72MHz / 72 = 1MHz
TIM_TimeBaseStruct.TIM_Period = 999;  // 1MHz / 1000 = 1kHz PWM
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);

4.配置PWM模式 :
TIM_OCInitTypeDef TIM_OCStruct;
TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCStruct.TIM_Pulse = 500;  // 50%占空比
TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCStruct);  // 配置通道1

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  // 使能预装载
TIM_ARRPreloadConfig(TIM3, ENABLE);  // 使能自动重载预装载

5.启动定时器 :
TIM_Cmd(TIM3, ENABLE);  // 启动TIM3

6.动态调整占空比 :
TIM_SetCompare1(TIM3, 750);  // 修改为75%占空比

九、总结summarize

STM32标准库定时器函数按功能分类清晰,使用时需遵循以下步骤:

  1. 使能对应总线时钟。

  2. 配置GPIO(如需输出/输入)。

  3. 初始化定时器时基参数。

  4. 配置具体功能(PWM/输入捕获等)。

  5. 使能中断(如需)。

  6. 启动定时器。

  7. 按需动态调整参数(如占空比、周期)。

相关推荐
不做无法实现的梦~15 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
忙什么果16 小时前
上位机、下位机、FPGA、算法放在哪层合适?
算法·fpga开发
熊猫_豆豆20 小时前
同步整流 Buck 降压变换器
单片机·嵌入式硬件·matlab
博览鸿蒙1 天前
从迷茫自学到稳定入行:我的 FPGA 上岸全过程
fpga开发
chenchen000000001 天前
49元能否买到四核性能?HZ-RK3506G2_MiniEVM开发板评测:MCU+三核CPU带来的超高性价比
单片机·嵌入式硬件
芯门1 天前
FPGA商用级ISP(二):镜头阴影校正(LSC)的网格增益插值与并行硬件架构实现
图像处理·fpga开发·isp
专注VB编程开发20年1 天前
简易虚拟 PLC 服务器-流水线自动化,上位机程序维护升级,西门子PLC仿真
服务器·单片机·自动化·上位机·plc·流水线·工控
LeoZY_1 天前
CH347/339W开源项目:集SPI、I2C、JTAG、SWD、UART、GPIO多功能为一体(3)
stm32·单片机·嵌入式硬件·mcu·开源
BackCatK Chen1 天前
第13篇:TMC2240 StallGuard4失速检测|寄存器配置+状态读取(保姆级)
单片机·嵌入式硬件·tmc2240·stm32实战·stallguard4·失速检测·电机故障识别
Hello_Embed1 天前
libmodbus STM32 板载串口实验(双串口主从通信)
笔记·stm32·单片机·学习·modbus