STM32CubeMX基础教程:使用TIM定时器

一、定时器分类

定时器主要分为三类定时器:

基本定时器(TIM6,TIM7),通用定时器(TIM2~TIM5),高级定时器(TIM1,TIM8)。

  1. 基本定时器(TIM6,TIM7)

可以看到,基本定时器只能起到定时的作用,并不能像另两种定时器一样产生PWM等,计数器模式也只有“向上”一种。

  1. 通用定时器(TIM2~TIM5)
  • 位于低速的APB1总线上。

  • 16 位向上、向下、中心对齐计数模式,自动装载计数器(TIMx_CNT)。

  • 16 位可编程预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。

  • 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:输入捕获、输出比较、PWM、单脉冲模式输出

  • 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。

  • 输入捕获:就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

    输出比较:有一寄存器先存放你要定时的数,例如50,定时器在内部时钟下由0开始慢慢向上加,每加一次都会和那个寄存器比较,当等于那个寄存器值时 如50,此管脚就会跳变(输出一高电平或低电平),在PWM中会经常用到。

    1. 高级定时器(TIM1,TIM8)

    二、定时器的时钟

    TIM2~TIM7是挂在APB1上的,TIM1和TIM8是挂在APB2上的。

    在STM32CubeMX中,TIM的Internal Clock来自下方的APBx Timer clock(MHz)。

    三、定时器的时钟

    1. 时钟源(对应STM32CubeMX中Clock Source)
  • 内部时钟源 CK_INT:在STM32CubeMX中就是Internal Clock。

  • 外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4),在STM32CubeMX中就是Trig Source。

  • 外部时钟模式 2:外部触发输入 ETR,在STM32CubeMX中就是Trig Source。

  • 内部触发输入(ITRx),在STM32CubeMX中就是Trig Source。

    1. 时基单元Time-base unit
  • 预分频器寄存器 (TIMx_PSC):设置分频器对时钟源的分频比或分频系数。

  • 计数器寄存器 (TIMx_CNT):向上计数、向下计数或者中心对齐计数

  • 自动重载寄存器 (TIMx_ARR):自动重装寄存器,为计数器设置计数边界或初始值,决定计数脉冲的多少或计时周期长短。比如计数器向上计数时,记到多少发生溢出;向下计数时从多少开始往下计数。带预装载使能控制位ARPE@TIMx_CR1。

  • 重复计数器寄存器 (TIMx_RCR):重复计数器,重复计数器是个向下计数器,当计数器发生 TIMx_RCR+1次溢出动作后会触发更新操作。

  • 捕捉/比较寄存器(TIMx_CCR):带预装载使能控制位OCxPE@TIMx_CCMR

    1. 输入捕获

    TIMx_CH1——TIMx_CH4 这四个通道,在芯片中都有对应的引脚,当脉冲从通道口进入时,经过输入滤波器(抗干扰的作用),然后经过边沿检测器检测到上升沿(下降沿),经过分频器,输入到公用部分中的捕获寄存器中,然后捕获寄存器记录此刻CNT计数器的值,当下一次下降沿(上升沿)过来时,也记录下CNT计数器的值,这样就可以计算出输入脉冲的宽度。

    4. 输出比较

    比如在比较寄存器中预先设定一个值,计数器从初始值到装载值之间计数时,当正好等于比较寄存器中的预设值时,控制TIMx_CH1~TIMx_CH4通道输出低电平或者高电平,这样随着计数器不断的计数,就可以获得一个脉冲,通过调整预设值,就可以调整脉冲宽度,调整初始值和装载值就可以调整周期就如同一个闹钟一样。(注意输入捕获和输出比较不可以同时进行)


    链接:STM32基础定时器详解_stm32定时器_strongercjd的博客-CSDN博客

    STM32笔记 (十一)高级定时器详解_dts_ck_CYRIL0124的博客-CSDN博客

    stm32初学之定时器TIM的基本定时功能以及介绍_stm32 tim_码农_风口的朱的博客-CSDN博客

    STM32——基本定时器(TIM6,TIM7)工作过程,解读功能框图,时序分析,周期计算_stm32 tim7_青篱竹枫的博客-CSDN博客

    四、使用定时器实现LED等闪烁
    1. CubeMX配置

  • 先选择TIM2的时钟为Internal Clock,同时在时钟树上设置APB1 Timer时钟为1MHz。

  • 设置预分频值为1000(填的999,实际中会+1),经过分频后的频率为1MHz/1000=1KHz。

  • 先设置TIMx_ARR的值为1000(同上),也就是当TIMx_CNT从0开始计算,刚好等于1000时生成事件,总共计数1000次。

  • 此时,一个时钟源周期为1ms,经过1000个周期刚好得到1s的定时周期。

  • 此外,打开该定时器的中断。设置PB5为GPIO Output作为LED灯的输出引脚。

    1. 代码
  • TIMx、GPIO时钟使能

  •   MX_GPIO_Init();
      MX_TIM2_Init();
  • 初始化定时器参数,设置自动重装值,分频系数,计数方式等

  •   void MX_TIM2_Init(void)
    {
      /* 其他代码省略*/
      /* USER CODE BEGIN TIM2_Init 1 */
    
      /* USER CODE END TIM2_Init 1 */
      htim2.Instance = TIM2;
      htim2.Init.Prescaler = 1000-1;     //预分频
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;  
      htim2.Init.Period = 1000;    
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    
    }
  • TIMx中断优先级设置

  • void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
    {
      if(tim_baseHandle->Instance==TIM2)
      {
        /* TIM2 clock enable */
        __HAL_RCC_TIM2_CLK_ENABLE();
    
        /* TIM2 interrupt Init */
        HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0);  //设置中断优先级
        HAL_NVIC_EnableIRQ(TIM2_IRQn);
      }
    }
  • 手动打开定时器中断

  • HAL_TIM_Base_Start_IT(&htim2);  //位置在main函数内
  • 编写中断服务函数

  • void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim->Instance == TIM2)
        {
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
        }
    }
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32CubeMX基础教程:使用TIM定时器

    发表评论