STM32定时器

STM32定时器

1、定时器概述

  • 软件定时原理:使用纯软件(CPU死等)的方式实现定时功能

    • 缺点
      • 延时不精准
      • CPU死等
  • 定时器定时原理:使用精准的时基,通过硬件的方式,实现定时功能

    • 核心:计数器

在这里插入图片描述

  • STM32定时器分类

在这里插入图片描述

  • STM32定时器特性表
定时器类型定时器计数器位数计数模式预分频系数(整数)产生DMA请求捕获/比较通道互补输出
基本定时器TIM6 TIM716递增1 ~ 65535可以0
通用定时器TIM2 TIM3 TIM4 TIM516递增、递减、中央对齐1 ~ 65535可以4
高级定时器TIM1 TIM816递增、递减、中央对齐1 ~ 65535可以4
  • STM32基本、通用、高级定时器功能整体的区别
定时器类型主要功能
基本定时器没有输入输出通道,常用作时基,即定时功能
通用定时器具有多路独立通道,可用于输入捕获/输出比较,也可用作时基
高级定时器除具备通用定时器所有功能外,还具备带死区控制的互补信号输出、刹车输入等功能(可用于电机控制、数字电源设计等)

2、基本定时器

  • 简介
    • 基本定时器
      • TIM6/TIM7
    • 特性
      • 16位递增计数器(计数值:0 ~ 65535)
      • 16位预分频器(分频系数:1 ~ 65536)
      • 可用于触发DAC
      • 在更新事件(计数器溢出)时,可产生中断/DMA请求
  • 框图
    1. 时钟源
    2. 控制器
    3. 计数器(时基单元)

在这里插入图片描述

  • 计数模式及溢出条件
计数器模式溢出条件
递增计数模式CNT == ARR
递减计数模式CNT == 0
中心对齐模式CNT == ARR - 1、CNT == 1
  • TIM6、TIM7寄存器
    • 控制寄存器1(TIMx_CR1)
      • 位7:设置ARR寄存器是否具有缓冲
      • 位0:使能/关闭计数器
    • DMA/中断使能寄存器(TIMx_DIER)
      • 位8:使能更新DMA
      • 位0:使能更新中断
    • 状态寄存器(TIMx_SR)
      • 位0:判断是否发生了更新中断,由硬件置1,软件清零
    • 计数器(TIMx_CNT)
      • 位[15:0]:计数器实时数值,范围:0 ~65535
    • 预分频寄存器(TIMx_PSC)
      • 位[15:0]:设置预分频系数,范围:0 ~ 65535,实际预分频系数等于[15:0] + 1
    • 自动重载寄存器(TIMx_ARR)
    • 位[15:0]:设置自动重装载值,范围:0 ~ 65535
  • 溢出时间计算方法
    • Tout = ( ARR + 1 ) * ( PSC + 1 ) / Ft
      • Tout是定时器溢出时间
      • Ft是定时器的时钟源频率
      • ARR是自动重装载寄存器的值
      • PSC是预分频寄存器的值
  • 定时器中断配置步骤
    1. 配置定时器基础工作参数
      • HAL_TIM_Base_Init()
    2. 定时器基础MSP初始化
      • HAL_TIM_Base_MspInit() 配置NVIC、CLOCK等
    3. 使能更新中断并启动计数器
      • HAL_TIM_Base_Start_IT()
    4. 设置优先级,使能中断
      • HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
    5. 编写中断服务函数
      • TIMx_IRQHandler()等 -> HAL_TIM_IRQHandler()
    6. 编写定时器更新中断回调函数
      • HAL_TIM_PeriodElapsedCallback()

3、通用定时器

  • 简介
    • 通用定时器
      • TIM2/TIM3/TIM4/TIM5
    • 特性
      • 16位递增、递减、中心对齐计数器(计数值:0 ~ 65535)
      • 16位预分频器(分频系数:1 ~ 65536)
      • 可用于触发DAC
      • 在更新事件(计数器溢出)、触发事件、输入捕获、输出比较时,可产生中断/DMA请求
      • 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
      • 使用外部信号控制定时器且可实现多个定时器互连的同步电路
      • 支持编码器和霍尔传感器电路等
  • 框图
    1. 时钟源
      • 内部时钟(CK_INT),来自外设总线APB提供的时钟
      • 外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号
      • 外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx_ETR的IO引脚
      • 内部触发输入(ITRx),用于与芯片内部其他通用/高级定时器级联
    2. 控制器
    3. 计数器(时基单元)
    4. 输入捕获
    5. 捕获/比较(公共)
    6. 输出比较

在这里插入图片描述

  • 通用定时器PWM输出

    • 原理

      • 假设:递增计数模式,ARR是自动重装载寄存器的值,CCRx是捕获/比较寄存器x的值
      • 结论:PWM波周期或频率由ARR决定,占空比由CRRx决定

      CNT < CRRx,IO输出0

      CRRx <= CNT <= ARR,IO输出1

    • PWM模式1

      • 递增

      CNT < CRRx,IO输出有效电平

      CRRx <= CNT <= ARR,IO输出无效电平

      • 递减

      CRRx < CNT <= ARR,IO输出无效电平

      CNT <= CRRx,IO输出有效电平

    • PWM模式2

      • 递增

      CNT < CRRx,IO输出无效电平

      CRRx <= CNT <= ARR,IO输出有效电平

      • 递减

      CRRx < CNT <= ARR,IO输出有效电平

      CNT <= CRRx,IO输出无效电平

    有/无效状态位由TIMx_CCER决定

    CCxP = 0:OCx高电平有效

    CCxP = 1:OCx低电平有效

    • 配置步骤
      1. 配置定时器基础工作参数
        • HAL_TIM_PWM_Init()
      2. 定时器PWM输出MSP初始化
        • HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
      3. 配置PWM模式/比较值等
        • HAL_TIM_PWM_ConfigChannel()
      4. 使能输出并启动计数器
        • HAL_TIM_PWM_Start()
      5. 修改比较直控制占空比(可选)
        • __HAL_TIM_SET_COMPARE()
      6. 使能通道预装载(可选)
        • __HAL_TIM_ENABLE_OCxPRELOAD()
  • 通用定时器输入捕获

    • 脉宽测量原理(以捕获测量高电平脉宽为例)

      • 假设:递增计数模式,ARR是自动重装载寄存器的值,CCRx1是t1时间点捕获/比较寄存器x的值,CCRx2是t2时间点捕获/比较寄存器x的值,
      • 结论:高电平期间,计时器计数的个数为 N * ( ARR + 1 ) + CCRx2
    • 配置步骤

      1. 配置定时器基础工作参数
        • HAL_TIM_IC_Init()
      2. 定时器输入捕获MSP初始化
        • HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等
      3. 配置输入通道映射、捕获边沿等
        • HAL_TIM_IC_ConfigChannel()
      4. 设置优先级,使能中断
        • HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
      5. 使能定时器更新中断
        • __HAL_TIM_ENABLE_IT()
      6. 使能捕获、捕获中断及计数器
        • HAL_TIM_IC_Start_IT()
      7. 编写中断服务函数
        • TIMx_IRQHandler()等 -> HAL_TIM_IRQHandler()
      8. 编写更新中断和捕获回调函数
        • HAL_TIM_PeriodElapsedCallback()
        • HAL_TIM_IC_CaptureCallback()

4、高级定时器

  • 简介

    • 高级定时器
      • TIM7/TIM8
    • 特性
      • 16位递增、递减、中心对齐计数器(计数值:0 ~ 65535)
      • 16位预分频器(分频系数:1 ~ 65536)
      • 可用于触发DAC、ADC
      • 在更新事件(计数器溢出)、触发事件、输入捕获、输出比较时,可产生中断/DMA请求
      • 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
      • 使用外部信号控制定时器且可实现多个定时器互连的同步电路
      • 支持编码器和霍尔传感器电路等
      • 重复计数器
      • 死区时间带可编程的互补输出
      • 断路输入,用于将定时器的输出信号置于用户可选的安全配置中
  • 框图

    • 时钟源、控制器、计数器(时基单元)、输入捕获、捕获/比较(公共)与通用定时器相同
    • 重复计数器
    • 输出比较(增加了带死区控制的互补输出)
    • 断路功能

在这里插入图片描述

  • 高级定时器输出指定个数PWM

    • 重复计数器特性

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

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

    • 原理与通用定时器输出PWM类似

      • 配置边沿对齐模式输出PWM
      • 指定输出N个PWM,则把N - 1写入RCR
      • 在更新中断内,关闭计数器

      高级定时器通道输出必须把MOE位置1

    • 配置步骤

      1. 配置定时器基础工作参数
        • HAL_TIM_PWM_Init()
      2. 定时器PWM输出MSP初始化
        • HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
      3. 配置PWM模式/比较值等
        • HAL_TIM_PWM_ConfigChannel()
      4. 设置优先级,使能中断
        • HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
      5. 使能定时器更新中断
        • __HAL_TIM_ENABLE_IT()
      6. 使能输出、主输出、计数器
        • HAL_TIM_PWM_Start()
      7. 编写中断服务函数
        • TIMx_IRQHandler()等 -> HAL_TIM_IRQHandler()
      8. 编写更新中断和捕获回调函数
        • HAL_TIM_PeriodElapsedCallback()
  • 高级定时器输出比较模式

    • 原理
      • 假设:输出比较模式为翻转,当CNT = CCRx,OCxREF电平翻转
      • 结论:PWM波周期或频率由ARR决定,占空比固定50%,相位由CRRx决定
    • 配置步骤
      1. 配置定时器基础工作参数
        • HAL_TIM_OC_Init()
      2. 定时器输出比较MSP初始化
        • HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等
      3. 配置输出比较模式等
        • HAL_TIM_OC_ConfigChannel()
      4. 使能通道预装载
        • __HAL_TIM_ENABLE_OCxPRELOAD()
      5. 使能输出、主输出、计数器
        • HAL_TIM_OC_Start()
      6. 修改捕获/比较寄存器的值
        • __HAL_TIM_SET_COMPARE()
  • 高级定时器互补输出带死区控制

    • 互补输出:OCx与OCxN输出波形反相
    • 带死区控制的互补输出:OCx高低电平转换与OCxN高低电平转换间有一部分无效时间,即死区时间

    无论何时,OCx和OCxN输出都不能同时处在有效电平

    • 死区时间计算

      • 确定tDTS的值:fDTS = Ft / 2时钟分频因子

      时钟分频因子:CKD[1:0],位于TIMx_CR1 寄存器

      • 判断DTG[7:5],选择计算公式

      DTG[7:5],位于TIMx_BDTR 寄存器

      • 代入选择的公式计算
    • 刹车(断路)功能

      • 使能刹车功能

      将TIMx_BDTR的BKE位置1,刹车输入信号极性由BKP位设置

      • 使能刹车功能后

      由TIMx_BDTR的MOE、OSSI、OSSR位,TIMx_CR2的OISx、OISxN位,TIMx_CCER的CCxE、CCxNE位控制OCx和OCxN输出状态

      • 发生刹车后

      1、MOE位被清零,OCx和OCxN为无效、空闲或复位状态(OSSI位选择)

      2、BIF位置1,如果使能了BIE位,还会产生刹车中断;如果使能了TDE位,会产生DMA请求

      3、如果AOE位置1,在下一个更新时间UEV时,MOE位被自动置1

    • 配置步骤

      1. 配置定时器基础工作参数
        • HAL_TIM_PWM_Init()
      2. 定时器PWM输出MSP初始化
        • HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
      3. 配置PWM模式/比较值等
        • HAL_TIM_PWM_ConfigChannel()
      4. 配置刹车功能、死区时间等
        • HAL_TIMEx_ConfigBreakDeadTime()
      5. 使能输出、主输出、计数器
        • HAL_TIM_PWM_Start()
      6. 使能互补输出、主输出、计数器
        • HAL_TIMEx_PWMN_Start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值