定时器种类
种类 | 功能 |
---|---|
通用定时器 | 输出比较,PWM,输入捕获 |
高级定时器 | 通用定时器功能、互补输出(PWM电机控制) |
基础定时器 | 用于控制DAC? |
寄存器
寄存器名称 | 功能 |
---|---|
PSC | 预分频器寄存器 |
ARR | 自动重载寄存器 |
CCR | 捕捉/比较寄存器 |
这三种寄存器在物理上是分为两个寄存器。
影子寄存器
目的:为了实现配置的同步,如在改变PWM的周期和占空比时,需要同步操作ARR和CCR比较寄存器;如同步操作多个定时器同步;
有影子寄存器就对应有预装载寄存器。
preload register(预装载寄存器):可以直接读写数据的寄存器;
shadow register(影子寄存器):用户无法直接操作,但真正起作用的寄存器。
例如:更改ARR寄存器。需要从ARR预装载寄存器更新到到影子寄存器。这个过程有两种方式,通过寄存器APRE(autopreload)控制。
一种是立刻更新(APRE =0 ,更改预装载寄存器值直接更新都),一种是等触发事件之后更新(APRE =1,当预装载寄存器值被修改时,必须在下一次更新事件(UEV)发生后才能更新影子寄存器的值);
HAL定时器常用函数
功能 | 初始化 | 使能 | 回调函数 |
---|---|---|---|
基本定时 | HAL_TIM_Base_Init HAL_TIM_Base_MspInit | HAL_TIM_Base_Start 还有_IT 中断模式 _DMA模式 | HAL_TIM_PeriodElapsedCallback |
输入捕捉 | HAL_TIM_IC_Init HAL_TIM_IC_MspInit | HAL_TIM_IC_Start 还有_IT 中断模式 _DMA模式 | HAL_TIM_IC_CaptureCallback |
其他功能类似;
PWM输出
MX中配置定时器,直接输出
代码中:
//PWM 使能
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
//修改周期:通过修改ARR值(修改周期还可以通过修改 分频值)
__HAL_TIM_SetAutoreload(&htim2, newPeriodTick);
//修改占空比:通过修改比较值
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwmTick);
输入捕捉
初始化中
//使能输入捕捉中断 并使能
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
//使能定时器 周期中断/溢出中断
HAL_TIM_Base_Start_IT(&htim2);
中断回调函数
//在溢出中断中对溢出次数 进行计数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2) {
tim2_overCnt++;
}
}
//在输出捕捉中断中计算 时间tick数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
uint32_t tick;
if(TIM2 == htim->Instance)
{
//记录当前中断的tick值
tick= HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
//记录两次中断之间的tick值
tim2_tick = tim2_overCnt*20000 + tick - tim2_lasttick ;
tim2_lasttick = tick ;
tim2_overCnt = 0;
//如果计算脉冲时间的话 需要改变捕捉的极性来捕捉下降沿时刻 从而计算脉冲时间
//__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
}
}
}
主函数中
通过周期数计算时间