STM32 HAL库学习笔记:定时器应用详解

这里写目录标题

  • 一、定时器概述(了解)
  • 1.1,软件定时原理
  • 1.2,定时器定时原理
  • 1.3,STM32定时器分类
  • 1.4,STM32定时器特性表
  • 1.5,STM32基本、通用、高级定时器的功能整体区别
  • 二、基本定时器(掌握)
  • 2.1,基本定时器简介(了解)
  • 2.2,基本定时器框图(熟悉)
  • 2.3,定时器计数模式及溢出条件(熟悉)
  • 2.4,定时器中断实验相关寄存器(了解)
  • 2.5,定时器溢出时间计算方法(掌握)
  • 2.6,定时器中断实验配置步骤(掌握)
  • 2.7,编程实战:定时器中断实验(掌握)![在这里插入图
  • 三、通用定时器(掌握)
  • 3.1,通用定时器简介(了解)
  • 3.2,通用定时器框图(熟悉)
  • 3.3,计数器时钟源(掌握)
  • 3.4,通用定时器PWM输出实验(掌握)
  • 3.4.1,通用定时器输出比较部分框图介绍(熟悉)
  • 3.4.2,通用定时器输出PWM原理(掌握)
  • 3.4.3,PWM模式(熟悉)
  • 3.4.4,通用定时器PWM输出实验配置步骤(掌握)
  • 3.4.5,编程实战:通用定时器PWM输出实验(掌握)![在这里插入图片描述](https://i3.wp.com/img-blog.csdnimg.cn/direct/5f56e90baa3f464fb6830eb8ac3c2982.png)
  • 3.5,通用定时器输入捕获实验(掌握)
  • 3.5.1,通用定时器输入捕获部分框图介绍(熟悉)
  • 3.5.2,通用定时器输入捕获脉宽测量原理(掌握)
  • 3.5.3,通用定时器输入捕获实验配置步骤(掌握)
  • 3.5.4,编程实战:通用定时器输入捕获实验(掌握)
  • 3.6,通用定时器脉冲计数实验(掌握)
  • 3.6.1,脉冲计数实验原理(熟悉)
  • 3.6.2,通用定时器脉冲计数实验配置步骤(掌握)
  • 3.6.3,编程实战:通用定时器脉冲计数实验(掌握)
  • 四、高级定时器(掌握)
  • 4.1,高级定时器简介(了解)
  • 4.2,高级定时器框图(熟悉)
  • 4.3,高级定时器输出指定个数PWM实验(掌握)
  • 4.3.1,重复计数器特性(熟悉)
  • 4.3.2,高级定时器输出指定个数PWM实验原理(掌握)
  • 4.3.3,高级定时器输出指定个数PWM实验配置步骤(掌握)
  • 4.3.4,编程实战:高级定时器输出指定个数PWM实验(掌握)
  • 4.4,高级定时器输出比较模式实验(掌握)
  • 4.4.1,高级定时器输出比较模式实验原理(掌握)
  • 4.4.2,高级定时器输出比较模式实验配置步骤(掌握)
  • 4.4.3,编程实战:高级定时器输出比较模式实验(掌握)
  • 4.5,高级定时器互补输出带死区控制实验(掌握)
  • 4.5.1,互补输出,还带死区控制,什么意思?(了解)
  • 4.5.2,带死区控制的互补输出应用之H桥(了解)
  • 4.5.3,捕获/比较通道的输出部分(通道1至3)(熟悉)
  • 4.5.4,死区时间计算(掌握)
  • 4.5.5,刹车(断路)功能(熟悉)
  • 4.5.6,高级定时器互补输出带死区控制实验配置步骤(掌握)
  • 4.5.7,编程实战:高级定时器互补输出带死区控制实验(掌握)
  • 4.6,高级定时器PWM输入模式实验(掌握)
  • 4.6.1,PWM输入模式工作原理(熟悉)
  • 4.6.2,PWM输入模式时序(熟悉)
  • 4.6.3,高级定时器PWM输入模式实验配置步骤(掌握)
  • 4.6.4,编程实战:高级定时器PWM输入模式实验(掌握)
  • 一、定时器概述(了解)

    1.1,软件定时原理

    使用纯软件(CPU死等)的方式实现定时(延时)功能

    1.2,定时器定时原理

    使用精准的时基,通过硬件的方式,实现定时功能

    1.3,STM32定时器分类

    1.4,STM32定时器特性表

    1.5,STM32基本、通用、高级定时器的功能整体区别

    二、基本定时器(掌握)

    2.1,基本定时器简介(了解)

    2.2,基本定时器框图(熟悉)

    2.3,定时器计数模式及溢出条件(熟悉)


    递增计数模式实例说明

    中心对齐模式实例说明

    2.4,定时器中断实验相关寄存器(了解)

    TIM6 和TIM7 控制寄存器 1(TIMx_CR1)

    TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
    TIM6 和TIM7 状态寄存器(TIMx_SR)

    TIM6 和TIM7 计数器(TIMx_CNT)

    TIM6 和TIM7 预分频器(TIMx_PSC)

    TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

    2.5,定时器溢出时间计算方法(掌握)

    2.6,定时器中断实验配置步骤(掌握)

    HAL_TIM_Base_Init()
    

    HAL_TIM_Base_MspInit()     //配置NVIC、CLOCK等
    

    HAL_TIM_Base_Start_IT()
    

    HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
    

    TIMx_IRQHandler()等、HAL_TIM_IRQHandler()
    

    HAL_TIM_PeriodElapsedCallback()
    

    相关HAL库函数介绍

    关键结构体介绍

    2.7,编程实战:定时器中断实验(掌握)![在这里插入图

    使用定时器6,实现500ms定时器更新中断,在中断里翻转LED0

    btim.c

    #include "./BSP/LED/led.h"
    #include "./BSP/TIMER/btim.h"
    TIM_HandleTypeDef g_timx_handle;  /* 定时器句柄 */
    /**
     * @brief       基本定时器TIMX定时中断初始化函数
     * @note
     *              基本定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
     *              基本定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz
     *              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
     *              Ft=定时器工作频率,单位:Mhz
     *
     * @param       arr: 自动重装值。
     * @param       psc: 时钟预分频数
     * @retval      无
     */
    void btim_timx_int_init(uint16_t arr, uint16_t psc)
    {
        g_timx_handle.Instance = BTIM_TIMX_INT;                      /* 通用定时器X */
        g_timx_handle.Init.Prescaler = psc;                          /* 设置预分频系数 */
        g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;         /* 递增计数模式 */
        g_timx_handle.Init.Period = arr;                             /* 自动装载值 */
        HAL_TIM_Base_Init(&g_timx_handle);
    
        HAL_TIM_Base_Start_IT(&g_timx_handle);    /* 使能定时器x及其更新中断 */
    }
    
    /**
     * @brief       定时器底层驱动,开启时钟,设置中断优先级
                    此函数会被HAL_TIM_Base_Init()函数调用
     * @param       htim:定时器句柄
     * @retval      无
     */
    void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
    {
        if (htim->Instance == BTIM_TIMX_INT)
        {
            BTIM_TIMX_INT_CLK_ENABLE();                     /* 使能TIM时钟 */
            HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占1,子优先级3,组2 */
            HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn);         /* 开启ITM3中断 */
        }
    }
    
    /**
     * @brief       定时器TIMX中断服务函数
     * @param       无
     * @retval      无
     */
    void BTIM_TIMX_INT_IRQHandler(void)
    {
        HAL_TIM_IRQHandler(&g_timx_handle); /* 定时器中断公共处理函数 */
    }
    
    /**
     * @brief       定时器更新中断回调函数
     * @param       htim:定时器句柄
     * @retval      无
     */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if (htim->Instance == BTIM_TIMX_INT)
        {
            LED1_TOGGLE(); /* LED1反转 */
        }
    }
    

    btim.h

    #ifndef __BTIM_H
    #define __BTIM_H
    
    #include "./SYSTEM/sys/sys.h"
    /******************************************************************************************/
    /* 基本定时器 定义 */
    /* TIMX 中断定义 
     * 默认是针对TIM6/TIM7
     * 注意: 通过修改这4个宏定义,可以支持TIM1~TIM8任意一个定时器.
     */
     #define BTIM_TIMX_INT                       TIM6
    #define BTIM_TIMX_INT_IRQn                  TIM6_DAC_IRQn
    #define BTIM_TIMX_INT_IRQHandler            TIM6_DAC_IRQHandler
    #define BTIM_TIMX_INT_CLK_ENABLE()          do{ __HAL_RCC_TIM6_CLK_ENABLE(); }while(0)   /* TIM6 时钟使能 */
    /******************************************************************************************/
    void btim_timx_int_init(uint16_t arr, uint16_t psc);    /* 基本定时器 定时中断初始化函数 */
    
    #endif
    

    main.c

    #include "./SYSTEM/sys/sys.h"
    #include "./SYSTEM/usart/usart.h"
    #include "./SYSTEM/delay/delay.h"
    #include "./BSP/LED/led.h"
    #include "./BSP/TIMER/btim.h"
    
    int main(void)
    {
        HAL_Init();                             /* 初始化HAL库 */
        sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
        delay_init(72);                         /* 延时初始化 */
        usart_init(115200);                     /* 串口初始化为115200 */
        led_init();                             /* 初始化LED */
        btim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */
    
        while (1)
        {
            LED0_TOGGLE();
            delay_ms(200);
        }
    }
    

    三、通用定时器(掌握)

    3.1,通用定时器简介(了解)

    3.2,通用定时器框图(熟悉)


    3.3,计数器时钟源(掌握)


    计数器时钟源寄存器设置方法(F1为例)

    外部时钟模式1

    外部时钟模式2

    使用一个定时器作为另一个定时器的预分频器(F1为例)

    解读通用定时器中断实验

    3.4,通用定时器PWM输出实验(掌握)

    3.4.1,通用定时器输出比较部分框图介绍(熟悉)


    捕获/比较通道1的主电路—输出部分

    捕获/比较通道的输出部分(通道1)

    3.4.2,通用定时器输出PWM原理(掌握)

    3.4.3,PWM模式(熟悉)


    3.4.4,通用定时器PWM输出实验配置步骤(掌握)

    HAL_TIM_PWM_Init()
    

    HAL_TIM_PWM_MspInit()     //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_PWM_ConfigChannel()
    

    HAL_TIM_PWM_Start()
    

    __HAL_TIM_SET_COMPARE()
    

    __HAL_TIM_ENABLE_OCxPRELOAD()
    

    相关HAL库函数介绍

    关键结构体介绍

    3.4.5,编程实战:通用定时器PWM输出实验(掌握)

    3.5,通用定时器输入捕获实验(掌握)

    3.5.1,通用定时器输入捕获部分框图介绍(熟悉)


    捕获/比较通道的输入部分(通道1)

    3.5.2,通用定时器输入捕获脉宽测量原理(掌握)

    3.5.3,通用定时器输入捕获实验配置步骤(掌握)

    HAL_TIM_IC_Init()
    

    HAL_TIM_IC_MspInit()     //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_IC_ConfigChannel()
    

    HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
    

    __HAL_TIM_ENABLE_IT()
    

    HAL_TIM_IC_Start_IT()
    

    TIMx_IRQHandler()等、 HAL_TIM_IRQHandler()
    

    HAL_TIM_PeriodElapsedCallback()、HAL_TIM_IC_CaptureCallback()
    

    相关HAL库函数介绍

    关键结构体介绍

    3.5.4,编程实战:通用定时器输入捕获实验(掌握)

    通过定时器5通道1来捕获按键高电平脉宽时间,通过串口打印出来

    3.6,通用定时器脉冲计数实验(掌握)

    3.6.1,脉冲计数实验原理(熟悉)


    外部时钟模式1

    3.6.2,通用定时器脉冲计数实验配置步骤(掌握)

    HAL_TIM_IC_Init()
    

    HAL_TIM_IC_MspInit()     //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_SlaveConfigSynchro()
    

    HAL_TIM_IC_Start()
    

    __HAL_TIM_GET_COUNTER()
    

    __HAL_TIM_SET_COUNTER()
    

    相关HAL库函数介绍

    关键结构体介绍

    3.6.3,编程实战:通用定时器脉冲计数实验(掌握)

    将定时器2通道1输入的高电平脉冲作为定时器2的时钟,并通过串口打印脉冲数

    四、高级定时器(掌握)

    4.1,高级定时器简介(了解)

    4.2,高级定时器框图(熟悉)

    4.3,高级定时器输出指定个数PWM实验(掌握)

    4.3.1,重复计数器特性(熟悉)


    计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件

    如果设置RCR为N,
    更新事件将在N+1
    次溢出时发生

    4.3.2,高级定时器输出指定个数PWM实验原理(掌握)

    4.3.3,高级定时器输出指定个数PWM实验配置步骤(掌握)

    HAL_TIM_PWM_Init()
    

    HAL_TIM_PWM_MspInit()   //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_PWM_ConfigChannel()
    

    HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
    

    __HAL_TIM_ENABLE_IT()
    

    HAL_TIM_PWM_Start()
    

    TIMx_IRQHandler()等、HAL_TIM_IRQHandler()
    

    HAL_TIM_PeriodElapsedCallback()
    

    相关HAL库函数介绍

    关键结构体介绍

    4.3.4,编程实战:高级定时器输出指定个数PWM实验(掌握)

    通过定时器8通道1实现指定个数PWM输出,用于控制LED1的亮灭

    4.4,高级定时器输出比较模式实验(掌握)

    4.4.1,高级定时器输出比较模式实验原理(掌握)

    4.4.2,高级定时器输出比较模式实验配置步骤(掌握)

    HAL_TIM_OC_Init()
    

    HAL_TIM_OC_MspInit()   //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_OC_ConfigChannel()
    

    __HAL_TIM_ENABLE_OCxPRELOAD()
    

    HAL_TIM_OC_Start()
    

    __HAL_TIM_SET_COMPARE()
    

    相关HAL库函数介绍

    关键结构体介绍

    4.4.3,编程实战:高级定时器输出比较模式实验(掌握)

    通过定时器8通道1/2/3/4输出相位分别为25%、50%、75%、100%的PWM

    4.5,高级定时器互补输出带死区控制实验(掌握)

    4.5.1,互补输出,还带死区控制,什么意思?(了解)

    4.5.2,带死区控制的互补输出应用之H桥(了解)

    4.5.3,捕获/比较通道的输出部分(通道1至3)(熟悉)

    4.5.4,死区时间计算(掌握)


    举个栗子(F1为例):DTG[7:0]=250
    250,即二进制:1111 1010,选第四条
    DT = (32+26)1655.56 ns=51.55968us

    4.5.5,刹车(断路)功能(熟悉)


    发生刹车后,会怎么样?

    4.5.6,高级定时器互补输出带死区控制实验配置步骤(掌握)

    HAL_TIM_PWM_Init()
    

    HAL_TIM_PWM_MspInit()     //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_PWM_ConfigChannel()
    

    HAL_TIMEx_ConfigBreakDeadTime()
    

    HAL_TIM_PWM_Start()
    

    HAL_TIMEx_PWMN_Start()
    

    相关HAL库函数介绍

    关键结构体介绍

    4.5.7,编程实战:高级定时器互补输出带死区控制实验(掌握)

    通过定时器1通道1输出频率为1KHz,占空比为70%的PWM,使用PWM模式1
    使能互补输出并设置死区时间控制:设置DTG为100(5.56us),进行验证死区时间是否正确
    使能刹车功能:刹车输入信号高电平有效,配置输出空闲状态等,最后用示波器验证

    4.6,高级定时器PWM输入模式实验(掌握)

    4.6.1,PWM输入模式工作原理(熟悉)

    4.6.2,PWM输入模式时序(熟悉)

    4.6.3,高级定时器PWM输入模式实验配置步骤(掌握)

    HAL_TIM_IC_Init()
    

    HAL_TIM_IC_MspInit()     //配置NVIC、CLOCK、GPIO等
    

    HAL_TIM_IC_ConfigChannel()
    

    HAL_TIM_SlaveConfigSynchro()
    

    HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
    

    HAL_TIM_IC_Start_IT()、 HAL_TIM_IC_Start()
    

    TIMx_IRQHandler()等、HAL_TIM_IRQHandler()
    

    HAL_TIM_IC_CaptureCallback()
    

    相关HAL库函数介绍

    关键结构体介绍

    4.6.4,编程实战:高级定时器PWM输入模式实验(掌握)

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HAL库学习笔记:定时器应用详解

    发表评论