欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > STM32 定时器讲解

STM32 定时器讲解

2025/6/20 8:22:38 来源:https://blog.csdn.net/qq_37669710/article/details/148768474  浏览:    关键词:STM32 定时器讲解

⏱️ ​一、核心配置函数

  1. 定时器初始化与复位

    • 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)。
  2. 时钟源选择

    • TIM_InternalClockConfig(TIMx)
      选择内部时钟(默认)。
    • TIM_ETRClockMode2Config(TIMx, prescaler, polarity, filter)
      配置外部时钟模式2(ETR引脚输入,直接驱动计数器)。
      参数
      • prescaler:外部触发预分频(TIM_ExtTRGPSC_DIV2等)
      • polarity:触发极性(上升沿/下降沿)
      • filter:滤波器值(0-0xF)

📡 ​二、输入捕获功能

  1. 输入捕获初始化

    • 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输入模式(双通道捕获同一信号,测量占空比)。
  2. 捕获值读取与配置

    • uint16_t TIM_GetCapturex(TIMx)​(x=1~4)
      读取通道捕获值(如脉冲宽度)。
    • TIM_SetICxPrescaler(TIMx, TIM_ICPSC_DIVy)
      设置输入捕获分频(每y个边沿触发一次捕获)。

⚡ ​三、输出比较与PWM

  1. 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预装载(占空比更新同步)。
  2. 动态调节与高级控制

    • TIM_SetComparex(TIMx, value)
      运行时修改CCRx(占空比)。
    • TIM_ForcedOCxConfig(TIMx, TIM_ForcedAction_Active)
      强制输出高/低电平(用于紧急制动)。
    • TIM_OCxFastConfig(TIMx, TIM_OCFast_Enable)
      使能快速模式(匹配时立即改变输出,非默认的下一周期)。

🔄 ​四、编码器接口

  1. 编码器模式配置
    • TIM_EncoderInterfaceConfig(TIMx, mode, pol1, pol2)
      配置正交编码器接口:
      • modeTIM_EncoderMode_TI1(仅TI1计数)、TI2TI12(双沿计数)
      • pol1/pol2:通道极性(上升沿/下降沿触发)
      TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
    • TIM_SetCounter(TIMx, 0)
      重置编码器计数值(如归零位置)。

🔔 ​五、中断与事件管理

  1. 中断控制

    • TIM_ITConfig(TIMx, TIM_IT_CC1 | TIM_IT_Update, ENABLE)
      使能捕获/更新等中断事件。
    • TIM_GetITStatus(TIMx, TIM_IT_Update)
      查询中断标志位(SET/RESET)。
    • TIM_ClearITPendingBit(TIMx, TIM_IT_CC1)
      清除中断标志(中断服务函数中必须调用)。
  2. 事件生成

    • TIM_GenerateEvent(TIMx, TIM_EventSource_Update)
      软件触发更新事件(同步寄存器)。
    • TIM_UpdateDisableConfig(TIMx, ENABLE)
      禁止更新事件(防止ARR/PSC被意外修改)。

⚠️ ​六、高级控制功能

  1. 刹车与死区控制

    • 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需调用)。
  2. 主从模式同步

    • TIM_SelectMasterSlaveMode(TIMx, TIM_MasterSlave_Enable)
      使能主从同步(用于定时器级联)。
    • TIM_SelectOutputTrigger(TIMx, TIM_TRGOSource_Update)
      设置触发输出源(如更新事件触发其他定时器)。

⚙️ ​七、时钟源与触发控制

  1. 外部时钟配置

    • TIM_TIxExternalClockConfig(TIMx, TIxSource, polarity, filter)
      使用外部引脚TIx作为时钟源(如测频应用)。
    • TIM_ITRxExternalClockConfig(TIMx, TIM_TS_ITR0)
      使用内部触发输入(ITRx)连接其他定时器。
  2. 触发选择

    • 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);
 
  1. 预装载机制

    • ARR预装载​:TIM_ARRPreloadConfig(TIMx, ENABLE) 确保ARR更新同步(多通道PWM必备)。
    • CCR预装载​:TIM_CCPreloadControl(TIMx, ENABLE) 使CCR更新在UEV事件时生效。
  2. 中断服务函数模板

    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);}
    }
  3. PWM频率与占空比计算
    FPWM​=(PSC+1)×(ARR+1)Fclk​​占空比=ARR+1CCR​×100%
    示例:72MHz时钟生成1kHz PWM(占空比50%)→ PSC=71ARR=999CCR=500


    STM32F103定时器全引脚映射表

    定时器通道默认引脚部分重映射引脚完全重映射引脚特性说明
    TIM1
    (高级)
    CH1PA8PE9-互补输出:PA7(CH1N)
    CH2PA9PE11-互补输出:PB0(CH2N)
    CH3PA10PE13-互补输出:PB1(CH3N)
    CH4PA11PE14-刹车输入:PA12(BKIN)
    TIM2
    (通用)
    CH1PA0PA15PB8注意:PA15与JTDI复用
    CH2PA1PB3PB9PB3默认JTDO,需禁用JTAG
    CH3PA2PB10PB10支持编码器模式
    CH4PA3PB11PB11外部触发:ETR@PA0
    TIM3
    (通用)
    CH1PA6PB4PC6重映射时PB4默认JTDO
    CH2PA7PB5PC7PB5默认JNTRST
    CH3PB0PB0PC8支持PWM输入捕获
    CH4PB1PB1PC9
    TIM4
    (通用)
    CH1PB6PD12-注意:PB6默认I2C1_SCL
    CH2PB7PD13-PB7默认I2C1_SDA
    CH3PB8PD14-
    CH4PB9PD15-
    TIM5
    (通用)
    CH1PA0--仅大容量型号支持
    CH2PA1--
    CH3PA2--
    CH4PA3--
    TIM8
    (高级)
    CH1PC6PI5-互补输出:​PA7​(CH1N)

    2

    4

    CH2PC7PI6-互补输出:​PB0​(CH2N)
    CH3PC8PI7-互补输出:​PB1​(CH3N)
    CH4PC9PI2-刹车输入:​PI1​(BKIN)

    5

    TIM6/7
    (基本)
    -无外部引脚--仅内部时钟,触发DAC用

    ⚙️ ​关键说明与注意事项

  4. 重映射配置流程

    • 使能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)。
  5. TIM8特殊配置要求

    • 互补输出使能​:需调用 TIM_CtrlPWMOutputs(TIM8, ENABLE) 激活PWM输出。
    • 刹车功能​:配置刹车引脚(如PI1)为复用模式,Alternate Function选 ​GPIO_AF3_TIM8
    • 死区时间​:通过 TIM_BDTRConfig() 设置死区寄存器,防止电机驱动直通。
  6. 冲突引脚处理

    • JTAG/SWD引脚​(PA15/PB3/PB4):用作定时器通道时需禁用JTAG:
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  // 保留SWD调试功能
    • I²C引脚​(PB6/PB7):用作TIM4通道时需关闭I²C外设时钟。
  7. 代码示例(TIM8_CH1 PWM输出)​

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词