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

STM32 HAL库常用GPIO函数以及外部中断配置与响应流程

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
个百zz分点个|  楼主 | 2023-12-27 18:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
所以如果没用CubeMX的话,打开中断但是不再次定义中断服务函数,外部中断来临时就会卡死。

使用特权

评论回复
22
个百zz分点个|  楼主 | 2023-12-27 18:59 | 只看该作者
接着执行用户编写的中断回调函数,用户需要在main.c文件中重新编写外部中断回调函数HAL_GPIO_EXTI_Callback(),来完成具体的中断处理任务。中断回调函数一般添加在/* USER CODE BEGIN4*/和/* USER CODE END4*/之间。

使用特权

评论回复
23
个百zz分点个|  楼主 | 2023-12-27 19:00 | 只看该作者
外部中断线0-15 :

给外部中断使用的硬件外部中断线有16个,但是GPIO端口却远不止16个,所以为了解决这个问题,采用了每一个外部中断线控制一组GPIO端口,即尾号相同的引脚作为一组被一条外部中断线控制:

使用特权

评论回复
24
个百zz分点个|  楼主 | 2023-12-27 19:00 | 只看该作者
当使用外部中断的时候,通过配置,我们可以将某一组中的某一个引脚连接到外部中断线上。所以一组引脚只能有一个作为外部中断引脚。例如,PA0、PB0、PC0、PD0、PE0、PF0、PG0和PH0这些引脚作为一组,如果我们使用PA0引脚作为外部中断引脚,那么该组的其余引脚就不能作为外部中断引脚使用。因此,从本质上讲,可供用户同时使用的外部中断引脚最多只有16个。

使用特权

评论回复
25
个百zz分点个|  楼主 | 2023-12-27 19:00 | 只看该作者
而且虽然外部中断线有16个,但是NVIC只为EXTI提供了7个中断通道,其中EXTI0_IRQ、EXTI1_IRQ、EXTI2_IRQ、EXTI3_IRQ、EXTI4_IRQ分别控制一条外部中断线,EXTI9_5_IRQ控制EXTI5-EXTI9,并且这几条外部中断线共享一个外部中断服务程序,EXTI5_10_IRQ同理。

使用特权

评论回复
26
个百zz分点个|  楼主 | 2023-12-27 19:00 | 只看该作者
配置过程:

其实将GPIO引脚和中断线相连的配置,在GPIO配置函数中就有提及:


使用特权

评论回复
27
个百zz分点个|  楼主 | 2023-12-27 19:01 | 只看该作者
IT就表示中断模式。

并且在stm32f1xx_hal_gpio.h中有定义:

使用特权

评论回复
28
个百zz分点个|  楼主 | 2023-12-27 19:01 | 只看该作者
选择好模式后就可以在HAL_GPIO_Init();函数中对外部中断进行配置了:


使用特权

评论回复
29
个百zz分点个|  楼主 | 2023-12-27 19:01 | 只看该作者
具体配置过程就设计硬件寄存器了,反正通过模式的选择在这里设置了引脚和外部中断线的映射关系。

使用特权

评论回复
30
个百zz分点个|  楼主 | 2023-12-27 19:01 | 只看该作者
注意:

初始化了PB1,如果PC1再初始化中断,那么PB1的中断映射将会被清除。

使用特权

评论回复
31
个百zz分点个|  楼主 | 2023-12-27 19:01 | 只看该作者
即如果在PB1和PB13、PB14中插入一个模式IT的PC1初始化函数,那么PB1的中断配置就会被覆盖。原因上文提及到,一条中断线只能和一个引脚映射。

使用特权

评论回复
32
个百zz分点个|  楼主 | 2023-12-27 19:02 | 只看该作者
调用HAL库中断处理函数的好处以及HAL库函数参数GPIO_PIN_(0-15):

通过NVIC分配到七条中断通道我们可以看到,其实外部中断一共有七个中断服务函数,在启动文件中由ST公司设置:

使用特权

评论回复
33
个百zz分点个|  楼主 | 2023-12-27 19:30 | 只看该作者
其中只有最后两个是多中断线共享一个中断服务函数。

当我们使用多个外部中断时,如果使用0、1、2三个外部中断,那么我们写中断函数,就要在三个中断服务函数中去写,很麻烦。

使用特权

评论回复
34
个百zz分点个|  楼主 | 2023-12-27 19:31 | 只看该作者
但是使用CubeMX时,就会自动生成中断服务函数,并且自动调用HAL库函数:

使用特权

评论回复
35
个百zz分点个|  楼主 | 2023-12-27 19:31 | 只看该作者
可以看到,不论是那条外部中断线,最后都是调用同一个HAL库中断服务函数, 只不过参数,即GPIO_PIN_()有变化,其实该参数仅仅是用来判断外部中断是由哪一条外部中断线产生的,仅此而已。

使用特权

评论回复
36
个百zz分点个|  楼主 | 2023-12-27 19:31 | 只看该作者
通过这样的处理,我们不论哪条外部中断线响应了,最后都是调用同一个中断回调函数:

使用特权

评论回复
37
个百zz分点个|  楼主 | 2023-12-27 19:31 | 只看该作者
这样,我们只需要在回调函数中判断一下形参GPIO_Pin的值,就可以判断是哪个引脚电平变化导致了中断响应,从而去编写相应的响应代码。

使用特权

评论回复
38
中国龙芯CDX| | 2023-12-28 08:51 | 只看该作者
细节很到位,非常方便

使用特权

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

本版积分规则