深入解析STM32定时器概念及实验(二)

系列文章目录

中断概念讲解及实验-CSDN博客

文章目录

目录

系列文章目录

文章目录

定时器的种类

高级定时器框图

通用定时器功能特点描述

 计数器模式

定时器溢出时间计算方法

定时器配置

定时器参数初始化

通用定时器常用寄存器和库函数

定时器中断一般配置步骤

能定时器时钟。

初始化定时器,配置 ARR,PSC 。

开启定时器中断,配置 NVIC 。

使能定时器。

 编写中断服务函数。

实验任务

实验结果 

引用


STM32F40x 系列总共最多有 14 个定时器

定时器的种类

高级定时器、通用定时器、基本定时器

高级定时器框图

STM32F4xx中文参考手册 P330

通用定时器功能特点描述

  • 16 /32 位向上、向下、向上 / 向下 ( 中心对齐 ) 计数模式,自动装载计数器( TIMx_CNT )。
  • 16 位可编程 ( 可以实时修改 ) 预分频器 (TIMx_PSC) ,计数器时钟频率的分频系数为 1 ~ 65535 之间的任意数值。
  • 4 个独立通道( TIMx_CH1~4 ),这些通道可以用来作为:
  • 输入捕获
  • 输出比较
  • PWM 生成 ( 边缘或中间对齐模式)
  • ④ 单脉冲模式输出
  •  可使用外部信号( TIMx_ETR )控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
  • STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和 PWM) 等。

     计数器模式

    通用定时器可以向上计数、向下计数、向上向下双向计数模式

    向上计数模式:

            计数器从 0 计数到自动加载值 (TIMx_ARR) ,然后重新从 0开始计数并且产生一个计数器溢出事件。
    ② 向下计数模式:

            计数器从自动装入的值 (TIMx_ARR) 开始向下计数到 0 ,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件
    ③ 中央对齐模式(向上 / 向下计数):

            计数器从 0 开始计数到自动装入的值 -1 ,产生一个计数器溢出事件,然后向下计数到 1 并且产生一个计数器溢出事件;然后再从 0 开始重新计数。

    定时器溢出时间计算方法

    重点(敲黑板)

    TIM_Period 和 TIM_Prescaler-CSDN博客

    
    //arr:自动重装值。
    //psc:时钟预分频数
    //Ft: 定时器工作频率,单位:Mhz
    //Tout: 定时器溢出时间
    
    Tout=((arr+1)*(psc+1))/Ft

    定时器配置

    定时器参数初始化

    // 函数引用
    void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
    
    //结构体定义
    typedef struct
    {
    uint16_t TIM_Prescaler;
    uint16_t TIM_CounterMode;
    uint16_t TIM_Period;
    uint16_t TIM_ClockDivision;
    uint8_t TIM_RepetitionCounter;
    } TIM_TimeBaseInitTypeDef;
    
    // 结构体举例
    TIM_TimeBaseStructure.TIM_Period = 4999;
    TIM_TimeBaseStructure.TIM_Prescaler =7199;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    定时器参数初始化:
    

    通用定时器常用寄存器和库函数

    //定时器使能函数:
    
    void TIM Cmd(TIM:TypeDef* TIMx, FunctionalState:NewState);
    
    //定时器中断使能函数:
    void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
    
    //状态标志位获取和清除
    /**
     * @brief 检查指定的定时器标志位是否被设置
     * @param TIMx 定时器的指针,如TIM1、TIM2等
     * @param TIM_FLAG 要检查的标志位,可以是以下值之一:
     *        - TIM_FLAG_Update: 更新事件标志位
     *        - TIM_FLAG_CC1: 捕获/比较通道1标志位
     *        - TIM_FLAG_CC2: 捕获/比较通道2标志位
     *        - TIM_FLAG_CC3: 捕获/比较通道3标志位
     *        - TIM_FLAG_CC4: 捕获/比较通道4标志位
     *        - TIM_FLAG_COM: 通道1和通道2的组合标志位
     *        - TIM_FLAG_Trigger: 触发事件标志位
     *        - TIM_FLAG_Break: 中断事件标志位
     * @return 标志位状态,可以是以下值之一:
     *        - SET: 标志位被设置
     *        - RESET: 标志位未被设置
     */
    FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
    
    /**
     * @brief 清除指定的定时器标志位
     * @param TIMx 定时器的指针,如TIM1、TIM2等
     * @param TIM_FLAG 要清除的标志位,可以是以下值之一:
     *        - TIM_FLAG_Update: 更新事件标志位
     *        - TIM_FLAG_CC1: 捕获/比较通道1标志位
     *        - TIM_FLAG_CC2: 捕获/比较通道2标志位
     *        - TIM_FLAG_CC3: 捕获/比较通道3标志位
     *        - TIM_FLAG_CC4: 捕获/比较通道4标志位
     *        - TIM_FLAG_COM: 通道1和通道2的组合标志位
     *        - TIM_FLAG_Trigger: 触发事件标志位
     *        - TIM_FLAG_Break: 中断事件标志位
     * @return 无
     */
    void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
    
    /**
     * @brief 检查指定的定时器中断是否发生
     * @param TIMx 定时器的指针,如TIM1、TIM2等
     * @param TIM_IT 要检查的中断,可以是以下值之一:
     *        - TIM_IT_Update: 更新事件中断
     *        - TIM_IT_CC1: 捕获/比较通道1中断
     *        - TIM_IT_CC2: 捕获/比较通道2中断
     *        - TIM_IT_CC3: 捕获/比较通道3中断
     *        - TIM_IT_CC4: 捕获/比较通道4中断
     *        - TIM_IT_COM: 通道1和通道2的组合中断
     *        - TIM_IT_Trigger: 触发事件中断
     *        - TIM_IT_Break: 中断事件中断
     * @return 中断状态,可以是以下值之一:
     *        - SET: 中断发生
     *        - RESET: 中断未发生
     */
    ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    
    /**
     * @brief 清除指定的定时器中断标志位
     * @param TIMx 定时器的指针,如TIM1、TIM2等
     * @param TIM_IT 要清除的中断标志位,可以是以下值之一:
     *        - TIM_IT_Update: 更新事件中断
     *        - TIM_IT_CC1: 捕获/比较通道1中断
     *        - TIM_IT_CC2: 捕获/比较通道2中断
     *        - TIM_IT_CC3: 捕获/比较通道3中断
     *        - TIM_IT_CC4: 捕获/比较通道4中断
     *        - TIM_IT_COM: 通道1和通道2的组合中断
     *        - TIM_IT_Trigger: 触发事件中断
     *        - TIM_IT_Break: 中断事件中断
     * @return 无
     */
    void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    

    定时器中断一般配置步骤

  • 能定时器时钟。

  • RCC_APB1PeriphClockCmd();
  • 初始化定时器,配置 ARR,PSC 。

  • TIM_TimeBaseInit();
  • 开启定时器中断,配置 NVIC 。

  • NVIC_Init();
  • 使能定时器。

  • TIM_Cmd();
  •  编写中断服务函数。

  • TIMx_IRQHandler();

    实验任务

       定时器3(TIM3),配置为500ms中断一次,在中断里面改变DS1的状态(亮/灭)         

    实验结果 

    本实验,DS0用来指示程序运行,400ms为一个周期。DS1用于定时器中断取反,指示
    定时器中断状态,1000ms为一个周期。下载完后,可以看到DS0快闪,DS1慢闪。

    tips 如果定义了TIM3_Int_Init函数,记得在main函数中引用回来

    引用

     同系列文章相同

    作者:优雅的造轮狮

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入解析STM32定时器概念及实验(二)

    发表评论