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);

 

posted @   薛定谔的小灯泡  阅读(4928)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示