STM32定时器
1、定时器概述
-
软件定时原理:使用纯软件(CPU死等)的方式实现定时功能
- 缺点
- 延时不精准
- CPU死等
- 缺点
-
定时器定时原理:使用精准的时基,通过硬件的方式,实现定时功能
- 核心:计数器
- STM32定时器分类
- STM32定时器特性表
定时器类型 | 定时器 | 计数器位数 | 计数模式 | 预分频系数(整数) | 产生DMA请求 | 捕获/比较通道 | 互补输出 |
---|---|---|---|---|---|---|---|
基本定时器 | TIM6 TIM7 | 16 | 递增 | 1 ~ 65535 | 可以 | 0 | 无 |
通用定时器 | TIM2 TIM3 TIM4 TIM5 | 16 | 递增、递减、中央对齐 | 1 ~ 65535 | 可以 | 4 | 无 |
高级定时器 | TIM1 TIM8 | 16 | 递增、递减、中央对齐 | 1 ~ 65535 | 可以 | 4 | 有 |
- STM32基本、通用、高级定时器功能整体的区别
定时器类型 | 主要功能 |
---|---|
基本定时器 | 没有输入输出通道,常用作时基,即定时功能 |
通用定时器 | 具有多路独立通道,可用于输入捕获/输出比较,也可用作时基 |
高级定时器 | 除具备通用定时器所有功能外,还具备带死区控制的互补信号输出、刹车输入等功能(可用于电机控制、数字电源设计等) |
2、基本定时器
- 简介
- 基本定时器
- TIM6/TIM7
- 特性
- 16位递增计数器(计数值:0 ~ 65535)
- 16位预分频器(分频系数:1 ~ 65536)
- 可用于触发DAC
- 在更新事件(计数器溢出)时,可产生中断/DMA请求
- 基本定时器
- 框图
- 时钟源
- 控制器
- 计数器(时基单元)
- 计数模式及溢出条件
计数器模式 | 溢出条件 |
---|---|
递增计数模式 | 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
- 控制寄存器1(TIMx_CR1)
- 溢出时间计算方法
- Tout = ( ARR + 1 ) * ( PSC + 1 ) / Ft
- Tout是定时器溢出时间
- Ft是定时器的时钟源频率
- ARR是自动重装载寄存器的值
- PSC是预分频寄存器的值
- Tout = ( ARR + 1 ) * ( PSC + 1 ) / Ft
- 定时器中断配置步骤
- 配置定时器基础工作参数
- HAL_TIM_Base_Init()
- 定时器基础MSP初始化
- 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()
- 配置定时器基础工作参数
3、通用定时器
- 简介
- 通用定时器
- TIM2/TIM3/TIM4/TIM5
- 特性
- 16位递增、递减、中心对齐计数器(计数值:0 ~ 65535)
- 16位预分频器(分频系数:1 ~ 65536)
- 可用于触发DAC
- 在更新事件(计数器溢出)、触发事件、输入捕获、输出比较时,可产生中断/DMA请求
- 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
- 使用外部信号控制定时器且可实现多个定时器互连的同步电路
- 支持编码器和霍尔传感器电路等
- 通用定时器
- 框图
- 时钟源
- 内部时钟(CK_INT),来自外设总线APB提供的时钟
- 外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号
- 外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx_ETR的IO引脚
- 内部触发输入(ITRx),用于与芯片内部其他通用/高级定时器级联
- 控制器
- 计数器(时基单元)
- 输入捕获
- 捕获/比较(公共)
- 输出比较
- 时钟源
-
通用定时器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低电平有效
- 配置步骤
- 配置定时器基础工作参数
- HAL_TIM_PWM_Init()
- 定时器PWM输出MSP初始化
- HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
- 配置PWM模式/比较值等
- HAL_TIM_PWM_ConfigChannel()
- 使能输出并启动计数器
- HAL_TIM_PWM_Start()
- 修改比较直控制占空比(可选)
- __HAL_TIM_SET_COMPARE()
- 使能通道预装载(可选)
- __HAL_TIM_ENABLE_OCxPRELOAD()
- 配置定时器基础工作参数
-
-
通用定时器输入捕获
-
脉宽测量原理(以捕获测量高电平脉宽为例)
- 假设:递增计数模式,ARR是自动重装载寄存器的值,CCRx1是t1时间点捕获/比较寄存器x的值,CCRx2是t2时间点捕获/比较寄存器x的值,
- 结论:高电平期间,计时器计数的个数为
N * ( ARR + 1 ) + CCRx2
-
配置步骤
- 配置定时器基础工作参数
- HAL_TIM_IC_Init()
- 定时器输入捕获MSP初始化
- 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()
- 配置定时器基础工作参数
-
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
-
配置步骤
- 配置定时器基础工作参数
- HAL_TIM_PWM_Init()
- 定时器PWM输出MSP初始化
- HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
- 配置PWM模式/比较值等
- 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()
- 配置定时器基础工作参数
-
-
高级定时器输出比较模式
- 原理
- 假设:输出比较模式为翻转,当CNT = CCRx,OCxREF电平翻转
- 结论:PWM波周期或频率由ARR决定,占空比固定50%,相位由CRRx决定
- 配置步骤
- 配置定时器基础工作参数
- HAL_TIM_OC_Init()
- 定时器输出比较MSP初始化
- HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等
- 配置输出比较模式等
- HAL_TIM_OC_ConfigChannel()
- 使能通道预装载
- __HAL_TIM_ENABLE_OCxPRELOAD()
- 使能输出、主输出、计数器
- HAL_TIM_OC_Start()
- 修改捕获/比较寄存器的值
- __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
-
配置步骤
- 配置定时器基础工作参数
- HAL_TIM_PWM_Init()
- 定时器PWM输出MSP初始化
- HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
- 配置PWM模式/比较值等
- HAL_TIM_PWM_ConfigChannel()
- 配置刹车功能、死区时间等
- HAL_TIMEx_ConfigBreakDeadTime()
- 使能输出、主输出、计数器
- HAL_TIM_PWM_Start()
- 使能互补输出、主输出、计数器
- HAL_TIMEx_PWMN_Start()
- 配置定时器基础工作参数