定时器初始化与复位
TIM_DeInit(TIM_TypeDef* TIMx)
TIM_TimeBaseInit(TIMx, TIM_TimeBaseInitTypeDef* initStruct)
static void TIM6_Config(uint32_t arr , uint32_t psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 开启定时器时钟,即内部时钟CK_INT=72M
RCC_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)
时钟源选择
TIM_InternalClockConfig(TIMx)
TIM_ETRClockMode2Config(TIMx, prescaler, polarity, filter)
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)
捕获值读取与配置
uint16_t TIM_GetCapturex(TIMx)
(x=1~4)TIM_SetICxPrescaler(TIMx, TIM_ICPSC_DIVy)
PWM通道初始化
TIM_OCxInit(TIMx, TIM_OCInitTypeDef* ocStruct)
(x=1~4)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)
动态调节与高级控制
TIM_SetComparex(TIMx, value)
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)
TIM_ClearITPendingBit(TIMx, TIM_IT_CC1)
事件生成
TIM_GenerateEvent(TIMx, TIM_EventSource_Update)
TIM_UpdateDisableConfig(TIMx, ENABLE)
刹车与死区控制
TIM_BDTRConfig(TIMx, TIM_BDTRInitTypeDef* bdtrStruct)
TIM_BDTRInitTypeDef bdtr;
bdtr.TIM_DeadTime = 0x4F; // 死区时间
bdtr.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRConfig(TIM1, &bdtr);
TIM_CtrlPWMOutputs(TIMx, ENABLE)
主从模式同步
TIM_SelectMasterSlaveMode(TIMx, TIM_MasterSlave_Enable)
TIM_SelectOutputTrigger(TIMx, TIM_TRGOSource_Update)
外部时钟配置
TIM_TIxExternalClockConfig(TIMx, TIxSource, polarity, filter)
TIM_ITRxExternalClockConfig(TIMx, TIM_TS_ITR0)
触发选择
TIM_SelectInputTrigger(TIMx, TIM_TS_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);
预装载机制
TIM_ARRPreloadConfig(TIMx, ENABLE)
确保ARR更新同步(多通道PWM必备)。TIM_CCPreloadControl(TIMx, ENABLE)
使CCR更新在UEV事件时生效。中断服务函数模板
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
定时器 | 通道 | 默认引脚 | 部分重映射引脚 | 完全重映射引脚 | 特性说明 |
---|---|---|---|---|---|
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用 |
重映射配置流程
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)
(标准库)或 __HAL_RCC_AFIO_CLK_ENABLE()
(HAL库)。// TIM3部分重映射至PB4/PB5(F1系列)
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
GPIO_Mode_AF_PP
)。TIM8特殊配置要求
TIM_CtrlPWMOutputs(TIM8, ENABLE)
激活PWM输出。GPIO_AF3_TIM8
。TIM_BDTRConfig()
设置死区寄存器,防止电机驱动直通。冲突引脚处理
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 保留SWD调试功能
代码示例(TIM8_CH1 PWM输出)