发新帖我要提问
12
返回列表
打印
[其他ST产品]

基于HAL库的中断详细学习

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
铁血丹心LLLL|  楼主 | 2024-2-29 18:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
默认的外部中断回调函数

外部中断回调函数HAL_GPIO_EXTI Callback()用于完成具体的中断处理任务。该函数也是HAL库提供的外部中断接口函数数,在stm32f4xx_hal_gpio.c文件中定义。默认的外部中断回调函数添加了weak属性,函数内部没有任何可执行代码,仅仅有一个避免编译器警告的语句:UNUSED(GPIO_Pin)。

默认的外部中断回调函数的代码如程序清单所示。

/*
* @brief EXTI line detection callbacks.
* @param GPIO_Pin Specifes the pins connected EXTI line
* @retval None
*/
_weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/*NOTE:This function Should not be modifed, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file*/
}

使用特权

评论回复
22
铁血丹心LLLL|  楼主 | 2024-2-29 18:02 | 只看该作者
执行用户编写的外部中断回调函数

用户需要在main.c文件中重新编写外部中断回调函数HAL_GPIO_EXTI_Callback(),来完成具体的中断处理任务。中断回调函数一般添加在/* USER CODE BEGIN4*/和/* USER CODE END4*/之间。由于所有通过于GPIO引脚触发的外部中断都会调用该回调函数,因此在回调函数内部,需要根据入口参参数GPIO_Pin判断是哪一个GPIO引脚触发的本次外部中断,然后再执行不同的中断处理任务。如果用户设置了多个GPIO引脚产生外部中断,则可以使用switch-case多分支语句进行判断。

外部中断回调函数的示例代码如程序法清单所示。


/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case GPIO_PIN_0: // 引脚 PCO 对应的中断处理任务
/* GPIO_PIN_0 EXTI handling */
break;
case GPIO_PIN_13:
/*GPIO_PIN_13 EXTI handling */ // 引脚 PC13 对应的中断处理任务
break;
case GPIO_PIN_X; // 引脚x对应的中断处理任务
/* GPIO_PIN_X EXTI handling */
break;
……
default:
break;
}
}
/* USER CODE END 4 */

使用特权

评论回复
23
铁血丹心LLLL|  楼主 | 2024-2-29 18:02 | 只看该作者
根据上述的分析,我们可以用下图来更加清晰地展示HAL库的外部中断处理流程。

从下图可以看到,发生外部中断时处理器在中断向量表找到所对应的中断服务程序,在中断服务程序内部调用外部中断通通用处理函数HAL_GPIO_EXTI_IRQHandler( ),最后再调用外部中断回调函数HAL_GP O_EXTICallback()来完成具体的中断处理任务。

使用特权

评论回复
24
铁血丹心LLLL|  楼主 | 2024-2-29 18:02 | 只看该作者
在HAL库的外部中断处理流程中,外部中断回调函数HAL_GPIO_EXTI_Callback()是放在main.c文件中,作为应用程序的一部分,而它的调用却是由HAL库提供的接口函数触发的,即库函数反过来调用应用层的函类数,因此称为回调函数。

借助CubeMX软件和HAL库,用户的中中断编程步骤大大简化,只需要利用CubeMX软件进行中断的相关配置,包括中断触发条件、中断优先级以及中断使能等,最后在中断回调函数中编写具体的中断处理任务即可。

使用特权

评论回复
25
铁血丹心LLLL|  楼主 | 2024-2-29 18:02 | 只看该作者
外部中断的HAL库定义
由于外部中断主要是利用GPIO引脚实现,因此与外部中断相关的HAL库定义都放在GPIO外设文件中:外部中断的数据类型位于 stm32f4xx_hal_gpio.h文件中,外部中断的接口函数位于 stm32f4xx_hal_gpio.c 文件中。

使用特权

评论回复
26
铁血丹心LLLL|  楼主 | 2024-2-29 18:03 | 只看该作者
外部中断的数据类型
HAL库中与外部中断相关的数据类型主要是外部中断触发方式的定义,这些定义作为引脚初始化数据类型GPIO_InitTypeDef中成员变量Mode增加的定义,用来选择外部中断的触发方式:上升沿触发、下降沿触发或双边沿触发,具体定义如下表所示。

使用特权

评论回复
27
铁血丹心LLLL|  楼主 | 2024-2-29 18:03 | 只看该作者
外部中断的接口函数
HAL库中与外部中断相关的常用接口函数有两个:

1.外部中断通用处理函数(HAL_GPIO_EXTI_IRQHandler)

GPIO_EXTI IRQHandler()该函数是所有外部中断发生后的通用处理函数。任何一个外部中断发生后,都会通过中断向量表中的外部中断服务程序调用该函数。在函数内部会进行GPIO引脚的判断,并清除对应的中断标志,最后调用外部中断回调函数 HAL_GPIOLEXTI_Callback()完成具体的中断处理任务。具体描述如下表所示:

使用特权

评论回复
28
铁血丹心LLLL|  楼主 | 2024-2-29 18:03 | 只看该作者
外部中断回调函数(HAL_GPIO_EXTI_Calback)

该函数用于执行具体的中断处理任务,即发生中断后应该完成的具体操作。任何一个外部中断发生后,都会调用外部中断回调函数,因此在函数内部需要先判断是哪一个引脚触发的本次外部中断,然后执行具体的中断处理任务。具体描述如下表所示。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则