对比标准库的流程使用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);