stm32f103 hal库中timer使用

stm32f103 hal库中timer使用

  • 使用步骤
    • 1.初始化定时器
    • 2.HAL_TIM_Base_Init(&htim2)基本参数配置
    • 3.重写void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)函数
    • 4.中断函数的重写
    • 5.如果想用溢出回调
    • 6.启动定时器
    • 7.整个代码

使用步骤

1.初始化定时器


	tim.Instance 			= TIM2;
	tim.Init.Period 		= 1000-1;
	tim.Init.Prescaler 		= (uint32_t)((SystemCoreClock / 1000) - 1);
	tim.Init.ClockDivision		= 0;
	tim.Init.CounterMode		= TIM_COUNTERMODE_UP;
	tim.Init.RepetitionCounter	= 0;
	tim.Init.AutoReloadPreload	= TIM_AUTORELOAD_PRELOAD_DISABLE;

2.HAL_TIM_Base_Init(&htim2)基本参数配置

HAL_TIM_Base_Init(&htim2);

3.重写void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)函数

在函数中我们需要使能timer的时钟、设置固定中断优先级和中断使能(此函数在2.HAL_TIM_Base_Init中调用)
注意:打开对应的时钟使能,我用的是TIM2

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {
    /* TIM2 clock enable */
    __HAL_RCC_TIM2_CLK_ENABLE();
    /* TIM2 interrupt Init */
   HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(TIM2_IRQn);
  }
}

4.中断函数的重写

void TIM2_IRQHandler(void)
{
	//自己想要做的事情,但是不能进入递归等函数,不要进行浮点运算!
	HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
	//结束自己要做的事情
  	HAL_TIM_IRQHandler(&tim);
}

5.如果想用溢出回调

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	/* 自己想要做的事情,与上面的要求一样 */
	//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}

6.启动定时器

编写到这里基本已经完成配置,接下来要启动定时器,定时器才能运行(不可以没有这一步)

HAL_TIM_Base_Start_IT(&tim);

7.整个代码

static TIM_HandleTypeDef	tim;

void TIM_Init(void)
{

	tim.Instance 				= TIM2;
	tim.Init.Period 			= 1000-1;
	tim.Init.Prescaler 			= (uint32_t)((SystemCoreClock / 1000) - 1);
	tim.Init.ClockDivision		= 0;
	tim.Init.CounterMode		= TIM_COUNTERMODE_UP;
	tim.Init.RepetitionCounter	= 0;
	tim.Init.AutoReloadPreload	= TIM_AUTORELOAD_PRELOAD_DISABLE;
	
	HAL_TIM_Base_Init(&tim);
	
	HAL_TIM_Base_Start_IT(&tim);
	
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspInit 0 */

  /* USER CODE END TIM2_MspInit 0 */
    /* TIM2 clock enable */
    __HAL_RCC_TIM2_CLK_ENABLE();

    /* TIM2 interrupt Init */
   HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(TIM2_IRQn);
  /* USER CODE BEGIN TIM2_MspInit 1 */
  /* USER CODE END TIM2_MspInit 1 */
  }
}

void TIM2_IRQHandler(void)
{
	
	HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
  HAL_TIM_IRQHandler(&tim);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	/* Toggle LED3 */
	//GpioToggle(&Led_tx);
	//HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}

你可能感兴趣的:(技术)