定时器中断实验:STM32+HAL+CubeMX


1 步骤:

1.1 初始化定时器参数

TIM_HandleTypeDef htim2;

void MX_TIM2_Init(void)
{
  htim2.Instance = TIM2;  //定时器2
  htim2.Init.Prescaler = 4999;  //分频系数psc
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;  //向上计数器
  htim2.Init.Period = 1599;  //自动装载值
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  //时钟分频因子
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  HAL_TIM_Base_Init(&htim2);  //初始化定时器2
  HAL_TIM_Base_Start_IT(&htim2);  //使能定时器2和更新中断
}

1.2 开启时钟、设置中断优先级

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
  __HAL_RCC_TIM2_CLK_ENABLE();  //使能TIM2时钟
  HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);  //设置中断优先级,抢占0,子优先级0
  HAL_NVIC_EnableIRQ(TIM2_IRQn);  //开启TIM2中断
}

1.3 编写中断服务函数

void TIM3_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim2);
}

1.4 编写中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim==(&htim2))  //判断是否为定时器TIM2
  {
  //此处写要实现的功能begin

  //此处写要实现的功能end

  //HAL_TIM_Base_MspDeInit(&htim2);   //根据需要,关闭定时器
  }
}

1.5 在main函数中调用MX_TIM2_Init();

 

2 使用CubeMX配置:

2.1 设置Clock Source时钟源、Prescaler、Counter Period参数

2.2 设置NVIC中断及优先级

 

3 基础知识

Prescaler——预分频器

Counter Period——主计数器

Preemption Priority——抢占优先级

Sub Priority——子优先级

定时时间=(Prescaler+1)*(Counter Period+1)*1/定时器时钟频率

例:时钟信号1MHz,Prescaler为9,Counter Period为999,则定时时间=(9+1)*(999+1)*1/1000=10ms