⏱️ 一、核心配置函数
-
定时器初始化与复位
-
TIM_DeInit(TIM_TypeDef* TIMx)
复位定时器所有寄存器至默认值,用于重新配置前的清理。 -
TIM_TimeBaseInit(TIMx, TIM_TimeBaseInitTypeDef* initStruct)
配置时基单元:预分频器(PSC)、自动重装值(ARR)、计数模式(向上/向下/中央对齐)。static void TIM6_Config(uint32_t arr , uint32_t psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// 开启定时器时钟,即内部时钟CK_INT=72MRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period = arr; // 时钟预分频数为TIM_TimeBaseStructure.TIM_Prescaler= psc;// 初始化定时器TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);// 清除计数器中断标志位TIM_ClearFlag(TIM6, TIM_FLAG_Update);// 开启计数器中断TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);// 使能计数器TIM_Cmd(TIM6, ENABLE); }
-
TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* initStruct)
初始化时基结构体为默认值(PSC=0, ARR=0xFFFF)。
-
-
时钟源选择
-
TIM_InternalClockConfig(TIMx)
选择内部时钟(默认)。 -
TIM_ETRClockMode2Config(TIMx, prescaler, polarity, filter)
配置外部时钟模式2(ETR引脚输入,直接驱动计数器)。
参数:prescaler
:外部触发预分频(TIM_ExtTRGPSC_DIV2等)polarity
:触发极性(上升沿/下降沿)filter
:滤波器值(0-0xF)
-
📡 二、输入捕获功能
-
输入捕获初始化
-
TIM_ICInit(TIMx, TIM_ICInitTypeDef* icStruct)
配置捕获通道参数:TIM_ICInitTypeDef ic; ic.TIM_Channel = TIM_Channel_1; // 通道1 ic.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿捕获 ic.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接映射到TI1 ic.TIM_ICFilter = 0x0A; // 滤波器值 TIM_ICInit(TIM5, &ic);
-
TIM_PWMIConfig(TIMx, TIM_ICInitTypeDef* icStruct)
自动配置PWM输入模式(双通道捕获同一信号,测量占空比)。
-
-
捕获值读取与配置
-
uint16_t TIM_GetCapturex(TIMx)
(x=1~4)
读取通道捕获值(如脉冲宽度)。 -
TIM_SetICxPrescaler(TIMx, TIM_ICPSC_DIVy)
设置输入捕获分频(每y个边沿触发一次捕获)。
-
⚡ 三、输出比较与PWM
-
PWM通道初始化
-
TIM_OCxInit(TIMx, TIM_OCInitTypeDef* ocStruct)
(x=1~4)
配置PWM模式、极性、占空比:TIM_OCInitTypeDef oc; oc.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 oc.TIM_Pulse = 500; // 占空比50%(ARR=1000时) oc.TIM_OutputState = TIM_OutputState_Enable; TIM_OC1Init(TIM2, &oc);
-
TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_Enable)
使能CCRx预装载(占空比更新同步)。
-
-
动态调节与高级控制
-
TIM_SetComparex(TIMx, value)
运行时修改CCRx(占空比)。 -
TIM_ForcedOCxConfig(TIMx, TIM_ForcedAction_Active)
强制输出高/低电平(用于紧急制动)。 -
TIM_OCxFastConfig(TIMx, TIM_OCFast_Enable)
使能快速模式(匹配时立即改变输出,非默认的下一周期)。
-
🔄 四、编码器接口
- 编码器模式配置
-
TIM_EncoderInterfaceConfig(TIMx, mode, pol1, pol2)
配置正交编码器接口:mode
:TIM_EncoderMode_TI1
(仅TI1计数)、TI2
或TI12
(双沿计数)pol1/pol2
:通道极性(上升沿/下降沿触发)
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
-
TIM_SetCounter(TIMx, 0)
重置编码器计数值(如归零位置)。
-
🔔 五、中断与事件管理
-
中断控制
-
TIM_ITConfig(TIMx, TIM_IT_CC1 | TIM_IT_Update, ENABLE)
使能捕获/更新等中断事件。 -
TIM_GetITStatus(TIMx, TIM_IT_Update)
查询中断标志位(SET/RESET)。 -
TIM_ClearITPendingBit(TIMx, TIM_IT_CC1)
清除中断标志(中断服务函数中必须调用)。
-
-
事件生成
-
TIM_GenerateEvent(TIMx, TIM_EventSource_Update)
软件触发更新事件(同步寄存器)。 -
TIM_UpdateDisableConfig(TIMx, ENABLE)
禁止更新事件(防止ARR/PSC被意外修改)。
-
⚠️ 六、高级控制功能
-
刹车与死区控制
-
TIM_BDTRConfig(TIMx, TIM_BDTRInitTypeDef* bdtrStruct)
配置死区时间、刹车极性(仅TIM1/TIM8)。
应用:电机驱动防止上下管直通。TIM_BDTRInitTypeDef bdtr; bdtr.TIM_DeadTime = 0x4F; // 死区时间 bdtr.TIM_BreakPolarity = TIM_BreakPolarity_High; TIM_BDTRConfig(TIM1, &bdtr);
-
TIM_CtrlPWMOutputs(TIMx, ENABLE)
使能高级定时器的PWM输出(TIM1/TIM8需调用)。
-
-
主从模式同步
-
TIM_SelectMasterSlaveMode(TIMx, TIM_MasterSlave_Enable)
使能主从同步(用于定时器级联)。 -
TIM_SelectOutputTrigger(TIMx, TIM_TRGOSource_Update)
设置触发输出源(如更新事件触发其他定时器)。
-
⚙️ 七、时钟源与触发控制
-
外部时钟配置
-
TIM_TIxExternalClockConfig(TIMx, TIxSource, polarity, filter)
使用外部引脚TIx作为时钟源(如测频应用)。 -
TIM_ITRxExternalClockConfig(TIMx, TIM_TS_ITR0)
使用内部触发输入(ITRx)连接其他定时器。
-
-
触发选择
-
TIM_SelectInputTrigger(TIMx, TIM_TS_TI1FP1)
选择输入触发源(如TI1FP1用于从模式触发)。 -
TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_Reset)
设置从模式(复位模式:触发信号复位计数器)。
-
📊 八、寄存器操作函数
函数 | 作用 | 典型场景 |
---|---|---|
TIM_SetCounter(TIMx, 0) | 重置计数器值 | 编码器位置归零 |
TIM_SetAutoreload(TIMx, 5000) | 修改ARR值(需配合TIM_ARRPreloadConfig ) | 动态调整PWM频率 |
TIM_GetPrescaler(TIMx) | 读取当前预分频器值 | 计算实际时钟频率 |
TIM_SetClockDivision(TIMx, TIM_CKD_DIV2) | 设置时钟分频(用于滤波器) | 降低输入噪声影响 |
💎 关键技巧与注意事项
// 配置PC6为TIM8_CH1输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_6;
gpio.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gpio);// 初始化TIM8 PWM
TIM_OCInitTypeDef oc;
TIM_OCStructInit(&oc);
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_Pulse = 400; // 占空比40%(ARR=1000时)
TIM_OC1Init(TIM8, &oc);
TIM_CtrlPWMOutputs(TIM8, ENABLE); // 高级定时器必需!
TIM_Cmd(TIM8, ENABLE);
-
预装载机制
- ARR预装载:
TIM_ARRPreloadConfig(TIMx, ENABLE)
确保ARR更新同步(多通道PWM必备)。 - CCR预装载:
TIM_CCPreloadControl(TIMx, ENABLE)
使CCR更新在UEV事件时生效。
- ARR预装载:
-
中断服务函数模板
void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update)) {// 处理定时任务(如刷新LED)TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 必须清除标志!}if (TIM_GetITStatus(TIM2, TIM_IT_CC1)) {uint16_t pulse = TIM_GetCapture1(TIM2); // 读取脉冲宽度TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);} }
-
PWM频率与占空比计算
FPWM=(PSC+1)×(ARR+1)Fclk占空比=ARR+1CCR×100%
示例:72MHz时钟生成1kHz PWM(占空比50%)→PSC=71
,ARR=999
,CCR=500
STM32F103定时器全引脚映射表
定时器 通道 默认引脚 部分重映射引脚 完全重映射引脚 特性说明 TIM1
(高级)CH1 PA8 PE9 - 互补输出:PA7(CH1N) CH2 PA9 PE11 - 互补输出:PB0(CH2N) CH3 PA10 PE13 - 互补输出:PB1(CH3N) CH4 PA11 PE14 - 刹车输入:PA12(BKIN) TIM2
(通用)CH1 PA0 PA15 PB8 注意:PA15与JTDI复用 CH2 PA1 PB3 PB9 PB3默认JTDO,需禁用JTAG CH3 PA2 PB10 PB10 支持编码器模式 CH4 PA3 PB11 PB11 外部触发:ETR@PA0 TIM3
(通用)CH1 PA6 PB4 PC6 重映射时PB4默认JTDO CH2 PA7 PB5 PC7 PB5默认JNTRST CH3 PB0 PB0 PC8 支持PWM输入捕获 CH4 PB1 PB1 PC9 TIM4
(通用)CH1 PB6 PD12 - 注意:PB6默认I2C1_SCL CH2 PB7 PD13 - PB7默认I2C1_SDA CH3 PB8 PD14 - CH4 PB9 PD15 - TIM5
(通用)CH1 PA0 - - 仅大容量型号支持 CH2 PA1 - - CH3 PA2 - - CH4 PA3 - - TIM8
(高级)CH1 PC6 PI5 - 互补输出:PA7(CH1N) 2
4
CH2 PC7 PI6 - 互补输出:PB0(CH2N) CH3 PC8 PI7 - 互补输出:PB1(CH3N) CH4 PC9 PI2 - 刹车输入:PI1(BKIN) 5
TIM6/7
(基本)- 无外部引脚 - - 仅内部时钟,触发DAC用
⚙️ 关键说明与注意事项
-
重映射配置流程
- 使能AFIO时钟:调用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)
(标准库)或__HAL_RCC_AFIO_CLK_ENABLE()
(HAL库)。 - 执行重映射:
// TIM3部分重映射至PB4/PB5(F1系列) GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
- 配置GPIO模式:设置为复用推挽输出(
GPIO_Mode_AF_PP
)。
- 使能AFIO时钟:调用
-
TIM8特殊配置要求
- 互补输出使能:需调用
TIM_CtrlPWMOutputs(TIM8, ENABLE)
激活PWM输出。 - 刹车功能:配置刹车引脚(如PI1)为复用模式,Alternate Function选
GPIO_AF3_TIM8
。 - 死区时间:通过
TIM_BDTRConfig()
设置死区寄存器,防止电机驱动直通。
- 互补输出使能:需调用
-
冲突引脚处理
- JTAG/SWD引脚(PA15/PB3/PB4):用作定时器通道时需禁用JTAG:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 保留SWD调试功能
- I²C引脚(PB6/PB7):用作TIM4通道时需关闭I²C外设时钟。
- JTAG/SWD引脚(PA15/PB3/PB4):用作定时器通道时需禁用JTAG:
-
代码示例(TIM8_CH1 PWM输出)