【STM32 HAL库】TIM定时器与CubeMX配置详解
【STM32 HAL库】TIM定时器与CubeMX配置
前言
本文为笔者学习TIM定时器知识的总结与复盘,基于keysking的系列视频,欢迎大家纠正文中错误
TIM定时器基本理论
定时器的本质就是计数器!
定时器的基本计数功能可以通过不同计数方式的组合,实现普通定时、脉冲捕获、测量PWM占空比、输出PWM、编码器测速等功能
定时器的基本作用
设定一个时间,时间到了后,通过中断通知STM32执行某些程序
定时器分类
基本定时器
通用定时器
高级定时器
定时器的外部时钟与从模式
从模式:
外部时钟模式1
以外部输入信号作为外部时钟源
复位模式
计数器更新 重新计数 触发更新中断
门模式
根据电平 暂停或继续计数
触发模式
启动计数 常配合单脉冲
TIM基本定时器
理论
基本定时功能与周期性产生中断
影子寄存器
预分频器与自动重装载寄存器控制着他们的影子寄存器
在当前计数周期完成后 寄存器将新的值给到影子寄存器中 更新完成
应用
CubeMX配置
开启TIM中断
若要每过一个计时周期进入一次中断并完成某项任务 则需开启TIM中断
定时器溢出时间 T(一个计时周期
触发事件选择见该Blog
一般情况下 :
激活 –> 根据计时需求配置PSC ARR –> 使能自动重装载寄存器的影子寄存器 –> 其他默认
Keil5代码
启动定时器计时功能 + 开启定时器中断
HAL_TIM_Base_Start_IT(TIM_Handle TypeDef* htim);
“定时器溢出”中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//判断中断源为tim3(tim3计数器溢出),进入if
if(htim == &htim3)
{
//当tim3计数器溢出时的逻辑代码
}
}
其他函数
//获取当前计数器的值
__HAL_TIM_GET_COUNTER(TIM_Handle TypeDef* htim);
//设置计数器的值
__HAL_TIM_SET_COUNTER(TIM_Handle TypeDef* htim);
//获取重装载寄存器的值
__HAL_TIM_GET_AUTORELOAD(TIM_Handle TypeDef* htim);
//设置重装载寄存器的值
__HAL_TIM_SET_AUTORELOAD(TIM_Handle TypeDef* htim);
//设置预分频器的值
__HAL_TIM_SET_PRESCALER(TIM_Handle TypeDef* htim);
输入捕获
作为精确的计时器,检测到输入信号电平变化(上升沿或下降沿,并记录当时时间点(记录到捕获寄存器中供程序读取
理论
应用
CubeMX配置
Keil5代码
开启输入捕获
HAL_TIM_IC_Start(TIM_Handle TypeDef* htim,uint32_t Channel);
开启输入捕获 + 开启输入捕获中断
HAL_TIM_IC_Start_IT(TIM_Handle TypeDef* htim,uint32_t Channel);
“输入捕获”中断回调函数
void HAL_TIM_IC_Capturecallback(TIM_HandleTypeDef *htim){
//养成好习惯 先判断中断源是否来自TIM1的通道4
if (htim == &htim1 && htim>Channel==HAL_TIM_ACTIVE_CHANNEL 4){
//逻辑代码
}
}
PWM
理论
PWM信号频率
应用
CubeMX配置
Keil5代码
开启PWM
HAL_TIM_PWM_Start(TIM_Handle TypeDef* htim,uint32_t Channel);
停止PWM
HAL_TIM_PWM_Stop(TIM_Handle TypeDef* htim,uint32_t Channel);
设置比较寄存器值
__HAL_TIM_SET_COMPARE(TIM_Handle TypeDef* htim,uint32_t Channel,COMPARE);
获取比较寄存器值
__HAL_TIM_GET_COMPARE(TIM_Handle TypeDef* htim,uint32_t Channel);
作者:Abaaba+