TIM定时器

1、概述

  1. 基本定时器
    1. 从基准时钟,到预分频器,到计数器
    2. 计数器技术自增,同时不断的与自动重装载寄存器进行比较
    3. 相等时,也就是计时时间到,这时会产生更新中断和一个更新事件
  2. 定时中断基本结构
    1. 中间时基单元:预分频器、计数器、自动重装寄存器
    2. 下面运行控制 就是控制寄存器的一些位,比如启动、停止、向上或向下计数,操作这些寄存器就能控制实际单元的运行了
    3. 左边是为时基单元提供时钟的部分
      1. 可以选择由RCC提供的内部时钟
      2. 可以选择ETR引脚提供的外部时钟模式二
      3. 还可以选择出发输入当作外部时钟 即外部时钟模式一—-对应的有ETR外部时钟、ITR其他定时器、TLx输入捕获通道
    4. 编码器模式一般是编码器独用,普通时钟用不到
    5. 右边这里就是定时时间到产生更新中断后的信号去向,在这里如果是高级定时器的话还会多一个重读计数器
      1. 这里中断信号会先在状态寄存器里置一个中断标志位,这个标志位会通过中断输出控制,到NVIC申请中断
      2. 有这个中断输出控制,是因为这个定时器模块有很多地方都要申请中断,
      3. 不仅更新会产生中断,上面触发信号也会申请中断 ,还有下面的输入捕获输出比较也会申请中断 ,所以这些中断都要经过中断输出控制 ,如果需要这个中断就允许 ,如果不需要那就禁止,简单来说这个中断输出控制就是中断的允许位,如果需要某个中断就允许一下

2、编码步骤

  1. RCC开启时钟
  2. 选择时基单元时钟源,对于定时中断我们就选择内部时钟源
  3. 配置时基单元,包括预分频器、计数器、自动重装器
  4. 配置输出终端控制,允许更新中断输出到NVIC
  5. 配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
  6. 运行控制
    1. 使能计数器,不然不会运行,当计数器使能之后,计数器开始计数,当计数器更新时,触发中断
  7. 写一个定时器中断函数,这样这个定时器中断函数每隔一段时间就能自执行一次

3、库函数介绍

  • void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
  • 时基单元初始化,用来配置时基单元
  • void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
  • 使能计数器
  • void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
  • 使能中断输出,就是中断输出控制
  • void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
  •         void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

            void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t

            void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t                                         TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);

            void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,                                                                 uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

            void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t                                 TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

  • void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
  • //单独配置ETR引脚的预分频器、极性、滤波器这些参数
  • void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
  • 写入预分频值
  • void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
  • 用来改变计数器的计数模式
  • void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
  • 自动重装器预装功能配置
  • 是否有预装是可以自己选择的
  • void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
  • 给计数器写入一个值
  • void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
  • 给自动重装器写一个值
  • uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
  • 获取当前计数器的值
  • uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
  • 获取当前预分频器的值
  • 4、编码步骤详解

    1.  开启定时器2的时钟 APB1
    2. 选择时基单元的时钟 TIM_InternalClockConfig
    3. 初始化时基单元
    4. 开启中断控制,开启了中断到NVIC的通路
    5. 配置NVIC
      1. NVIC优先级分组
      2. 初始化NVIC
    6. 使能定时器
    7. 初始化完成之后
    8. 写中断函数
      1. 检查中断标志位
      2. 清除中断标志位
    9. 定时器外部时钟->在上面的代码基础上进行修改
      1. 时钟部分,就不使用内部时钟了
      2. 使用TIM_ETRClockMode2Config
      3. 开启GPIO的时钟
      4. 初始化GPIO

    作者:FLYQR

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32定时器应用详解

    发表评论