[其他ST产品] STM32 HAL库常用GPIO函数以及外部中断配置与响应流程

[复制链接]
2415|37
 楼主| 个百zz分点个 发表于 2023-12-27 18:59 | 显示全部楼层
所以如果没用CubeMX的话,打开中断但是不再次定义中断服务函数,外部中断来临时就会卡死。
68584658c039b61887.png
 楼主| 个百zz分点个 发表于 2023-12-27 18:59 | 显示全部楼层
接着执行用户编写的中断回调函数,用户需要在main.c文件中重新编写外部中断回调函数HAL_GPIO_EXTI_Callback(),来完成具体的中断处理任务。中断回调函数一般添加在/* USER CODE BEGIN4*/和/* USER CODE END4*/之间。
 楼主| 个百zz分点个 发表于 2023-12-27 19:00 | 显示全部楼层
外部中断线0-15 :

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

48001658c03b8634c5.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:00 | 显示全部楼层
当使用外部中断的时候,通过配置,我们可以将某一组中的某一个引脚连接到外部中断线上。所以一组引脚只能有一个作为外部中断引脚。例如,PA0、PB0、PC0、PD0、PE0、PF0、PG0和PH0这些引脚作为一组,如果我们使用PA0引脚作为外部中断引脚,那么该组的其余引脚就不能作为外部中断引脚使用。因此,从本质上讲,可供用户同时使用的外部中断引脚最多只有16个。
 楼主| 个百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同理。
 楼主| 个百zz分点个 发表于 2023-12-27 19:00 | 显示全部楼层
配置过程:

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

91501658c03e401913.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:01 | 显示全部楼层
IT就表示中断模式。

并且在stm32f1xx_hal_gpio.h中有定义:

14698658c03ef86c79.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:01 | 显示全部楼层
选择好模式后就可以在HAL_GPIO_Init();函数中对外部中断进行配置了:

80810658c03fbc7af3.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:01 | 显示全部楼层
具体配置过程就设计硬件寄存器了,反正通过模式的选择在这里设置了引脚和外部中断线的映射关系。
 楼主| 个百zz分点个 发表于 2023-12-27 19:01 | 显示全部楼层
注意:

初始化了PB1,如果PC1再初始化中断,那么PB1的中断映射将会被清除。
 楼主| 个百zz分点个 发表于 2023-12-27 19:01 | 显示全部楼层
99472658c0419071e4.png 即如果在PB1和PB13、PB14中插入一个模式IT的PC1初始化函数,那么PB1的中断配置就会被覆盖。原因上文提及到,一条中断线只能和一个引脚映射。
 楼主| 个百zz分点个 发表于 2023-12-27 19:02 | 显示全部楼层
调用HAL库中断处理函数的好处以及HAL库函数参数GPIO_PIN_(0-15):

通过NVIC分配到七条中断通道我们可以看到,其实外部中断一共有七个中断服务函数,在启动文件中由ST公司设置: 43316658c04302051a.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:30 | 显示全部楼层
其中只有最后两个是多中断线共享一个中断服务函数。

当我们使用多个外部中断时,如果使用0、1、2三个外部中断,那么我们写中断函数,就要在三个中断服务函数中去写,很麻烦。
 楼主| 个百zz分点个 发表于 2023-12-27 19:31 | 显示全部楼层
但是使用CubeMX时,就会自动生成中断服务函数,并且自动调用HAL库函数:
33834658c0b037ca81.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:31 | 显示全部楼层
可以看到,不论是那条外部中断线,最后都是调用同一个HAL库中断服务函数, 只不过参数,即GPIO_PIN_()有变化,其实该参数仅仅是用来判断外部中断是由哪一条外部中断线产生的,仅此而已。
74711658c0b10a2f1f.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:31 | 显示全部楼层
通过这样的处理,我们不论哪条外部中断线响应了,最后都是调用同一个中断回调函数:

23259658c0b1e919e5.png
 楼主| 个百zz分点个 发表于 2023-12-27 19:31 | 显示全部楼层
这样,我们只需要在回调函数中判断一下形参GPIO_Pin的值,就可以判断是哪个引脚电平变化导致了中断响应,从而去编写相应的响应代码。
中国龙芯CDX 发表于 2023-12-28 08:51 | 显示全部楼层
细节很到位,非常方便
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部