定时器详细介绍(基于标准库的,原理部分可参考

1. 定时器中断配置 配置参考 

使用内部时钟:internal clock,其它默认

cubemax配置时钟_cubemax配置时钟

 

定时器计数值更新时间:

cubemax配置时钟_寄存器_02

 

 

 T为定时时间,Psc为预分频数,Arr为自动重装载寄存器的值,Tclk为定时器的输入时钟。
这里为T为1s,Tclk为72MHz,设置Psc为7200-1,Arr为10000-1。

自动重载值。

 

cubemax配置时钟_寄存器_03

 

打开中断:(在高级定时器中,选择为:TIMX update interrupt)

cubemax配置时钟_寄存器_04

 

 

 代码部分:

开启定时器:

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

中断回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 1 */

  if (htim->Instance == TIM3) { //获取触发中断的定时器号
    printf("tim3! \r\n");
  }

  /* USER CODE END Callback 1 */
}

2. 定时器PWM波输出模式

 

cubemax配置时钟_调用函数_05

 

 

注意自动配置的GPIO口是否是自己想要的,若不是,且目标io口未被占用,可先将该通道disable,再直接点击目标口主动选择,如下图,选择后再在上图进行配置

cubemax配置时钟_寄存器_06

 

 

 参数配置:

cubemax配置时钟_cubemax配置时钟_07

 

 

 

 内部时钟为 72Mhz,72分频后到定时器时钟1Mhz,1us定时器计数一次,从0计数到99,定时器溢出,重装载值,进行下一次计数。

pwm波频率计算:

cubemax配置时钟_调用函数_08


 其中:TIMf定时器时基频率,这里为72Mhz,ARR为自动重载值,即Counter Period(AutoReload Register)

由计数比较值控制占空比 Pluse,pwm模式控制极性(输出电平高低):

PWM模式1,在向上计数时,一旦TIMx_CNT < TIMx_CCR1(上面那个pulse) 时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2- 在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT > TIMx_CCR1时通道1为有效电平,否则为无效电平。

生成代码:

手动开启PWM波输出通道:使用定时器PWM函数组,阻塞模式开启(没用中断和dma配置)

cubemax配置时钟_cubemax配置时钟_09

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);

修改占空比推荐使用寄存器的方式: TIMx->CCRx = NUM;   (x为数字。 NUM 范围0 - ARR)

或者调用函数:_HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_X,X);

__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,50);

建议先关闭定时器在修改值。

3.定时器输出比较模式

与pwm波输出方式只能调制占空比相比,输出比较模式只能调整相位,注意这里的频率由于要通过两次比较后电平翻转得到,自动重载值减半。

cubemax配置时钟_调用函数_10

 

 

 使能通道输出:

HAL_TIM_OC_Start(&htim3,TIM_CHANNEL_1);
    HAL_TIM_OC_Start(&htim3,TIM_CHANNEL_2);