HAL库_定时器更新中断+流水灯

对比标准库的流程使用HAL库编写定时器更新中断

标准库中使用定时器更新中断的方式:

1.开时钟,设置TIM的时钟

2.初始化定时器石基的结构体

3.调用Init初始化函数

4.处理定时器中断

HAL中使用定时器更新中断的方式:

1.开时钟

2.初始化定时器石基的结构体

3.处理定时器中断

3.1在CubeMx中设置NVIC的抢占优先级和子优先级

3.2 编写TIM3_IRQHandler    //重点

先来看标准库中怎么处理这个中断,首先从启动文件中找到定时器中断的函数名字,然后再函数里判断是定时器的哪种中断(更新?输入捕获?输出比较?),然后清标志位,然后才写我们在中断干什么的代码。HAL中处理的方式有些变化。

stm32fxx_it.c文件中找到了和标准库中一样名字的中断函数。

 1 void TIM3_IRQHandler(void)
 2 {
 3   /* USER CODE BEGIN TIM3_IRQn 0 */
 4 
 5   /* USER CODE END TIM3_IRQn 0 */
 6   HAL_TIM_IRQHandler(&htim3);
 7   /* USER CODE BEGIN TIM3_IRQn 1 */
 8 
 9   /* USER CODE END TIM3_IRQn 1 */
10 }

这里面什么都没做只是调用了一个函数  HAL_TIM_IRQHandler(&htim3);

这个函数中完成了判断中断类型,清中断标志位的操作。我们只要写真正的处理代码即可。这也就是回调函数。

HAL_TIM_IRQHandler(&htim3);函数中调判断了各种定时器的中断类型,也调用了对应的中断处理函数(回调函数),包括:

 1 /* Callback in non blocking modes (Interrupt and DMA) *************************/
 2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
 3 void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim);
 4 void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);
 5 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
 6 void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);
 7 void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
 8 void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);
 9 void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);
10 void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim);
11 void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim);

总结一下思路就是:

启动文件中有定时器中断的函数名字:TIM3_IRQHandler  这个名字是不能改的

stm32fxx_it.c中调用: void TIM3_IRQHandler(void),它又调用了HAL_TIM_IRQHandler(&htim3)(这个函数在stm32f1xx_hal_tim.c中由库实现)

在stm32f1xx_hal_tim.c中 HAL_TIM_IRQHandler(&htim3)这个函数调用了各种定时器的具体中断类型的函数(回调函数);声明在stm32f1xx_hal_tim.h中。

具体的回调函数在外设的.c文件中以__weak关键字定义但没实现,我们需要去处理这些回调函数。该回调函数和标准库中的中断函数一样,可在任意文件中实现

在HAL中,无论是串口的中断,DMA的中断,定时器的中断,都是以这种方法组织的。

下面是定时器更新中的回调函数实现:

1 /* USER CODE BEGIN 1 */
2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
3 {
4     if(htim==&htim3)
5     {
6         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
7         HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
8     }
9 }

 别忘了开启定时器中断:&htim3就是一个句柄

HAL_TIM_Base_Start_IT(&htim3);
原文地址:https://www.cnblogs.com/1024E/p/13347725.html