STM32HAL库GPIO和EXTI

STM32芯片具有多组GPIO端口,每个端口有16个引脚,支持多种工作模式。通过HAL库,可以方便地进行GPIO电平输出、翻转和输入读取。中断系统中,EXTI管理外部中断,STM32的GPIO引脚分组连接到EXTI线,NVIC提供中断通道。中断触发方式包括上升沿、下降沿和双边沿。HAL库提供了中断处理函数和回调机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32HAL库

GPIO

  • STM32芯片最多拥有7组端口(GPIOA—GPIOG),每组端口最多有用16个引脚(Pin0—Pin15)
  • STM32的每个I/O端口都可以自由编程,但I/O端口寄存器必须按32位字访问
  • 对底层硬件的操作就是对寄存器的操作
  • STM32的每个I/O端口都有7个寄存器来控制
  • STM32的I/O端口可由软件配置成8种模式
  • STM32CubeMX可以实现初始化操作
8种工作模式
  1. 推挽输出
  2. 开漏输出
  3. 复用推挽输出
  4. 复用开漏输出
  5. 模拟输入
  6. 浮空输入
  7. 下拉输入
  8. 上拉输入
库函数

HAL:硬件抽象层

GPIO电平输出HAL库函数
void HAL_GPIO_WritePin(GPIO_TyoeDef* GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState);

1-GPIOx :端口号

2-GPIO_Pin :引脚号

3-PinState :GPIO_PIN_SET(高电平);GPIO_PIN_RESET(低电平)

GPIO电平翻转HAL库函数
void HAL_GPIO_TogglePin(GPIO_TyoeDef* GPIOx,uint16_t GPIO_Pin);

1-GPIOx :端口号

2-GPIO_Pin :引脚号

GPIO输入HAL库函数
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TyoeDef* GPIOx,uint16_t GPIO_Pin);

1-GPIOx :端口号

2-GPIO_Pin :引脚号

3-GPIO_PinState :引脚状态

image-20230226161643294

代码保护作用

截屏2023-02-26 16.22.29

将代码写到BEGIN和END之间,如果重新配置STM32CubeMX配置生成代码原来的代码不会被覆盖

中断系统

EXTI

外部中断,是指一些涉及GPIO引脚电平变化或者RTC和USB等外设唤醒事件所触发的中断,由外部中断控制器EXTI管理。

  • 中断的基本概念:中断源、中断优先级、中断通道、中断服务程序ISR
  • 在STM32中能打断当前代码执行流程的事件分为:异常和中断
  • 异常:通常由内核自身产生,大多数由软件触发,例如:除法出错
  • 中断:由内核外设产生的,一般由硬件触发,如定时器中断

中断触发方式有三种:上升沿触发、下降沿触发和双边沿触发。我们把通过GPIO引脚产生的中断简称为外部中断。

image-20230226171558943

  • STM32将GPIO引脚进行了分组:尾号相同的引脚作为一组,通过1个多路选择器连接到1个EXTI外部中断线。同组的引脚只能由1个与外部中断线连接,其他引脚就不能作为外部引脚,本质上可供用户同时使用的外部中断引脚最多只有16个。
  • NVIC为EXTI所管理的16个外部中断线提供了7个中断通道。EXTI0EXTI4连接到独立的中断通道,有单独的ISR。EXTI5EXTI9共享1个中断通道,EXTI10~EXTI15共享1个中断通道。
  • 对于共用中断服务程序的ISR的,需要在ISR中判断,具体是哪个EXTI外部中断线产生的中断,然后再做相应的处理。

image-20230226172406540

常用的库函数

ISR中调用的外部中断通用处理函数
HAL_GPIO_EXTI_IRHandler();
外部中断回调函数,实现中断逻辑处理
HAL_GPIO_EXTI_Callback();
检查某个外部中断线是否有挂起标志位
__HAL_GPIO_EXTI_GET_TI();
清除某个外部中断线的挂起标志位
__HAL_GPIO_EXTI_CLEAR_TI();
在某个外部中断线上产生软中断
__HAL_GPIO_EXTI_GENERATE_SWIT();

注意:在HAL库中,以双下划线HAL,即“__HAL”为前缀的,是宏函数。如

#define __HAL_GPIO_EXTI_GET_TI(__EXTI_LINE__) (EXTI->PR&(__EXTI_LINE__))

image-20230226222616225

image-20230226222637537

image-20230226222652337

找到外部中断回调函数

image-20230226223252827

重写外部中断回调函数

image-20230226223632093

所有的中断都会调用一个中断回调函数,通过判断中断线路来判断

image-20230226223814984

基于HAL库的STM32外部中断处理流程

  1. 将引脚设置为GPIO_EXTx功能,选择好触发方式,输入模式和用户标签。
  2. 在NVIC控制器中使能对应的中断通道image-20230226231918785

image-20230226232247659

image-20230226232556968

image-20230226232718107

### 使用 `HAL_GPIO_EXTI_ClearIT` 函数清除 GPIO EXTI 中断标志位 在 STM32HAL 中,`HAL_GPIO_EXTI_ClearIT` 是用于清除特定 GPIO 线上的外部中断挂起位的函数。该函数确保中断服务程序 (ISR) 只处理一次触发事件,并防止重复进入 ISR。 当检测到外部中断线的状态变化时,STM32 微控制器会设置相应的中断挂起位。如果不及时清除这些挂起位,在下一次查询状态时仍会被认为有未处理的中断请求存在[^1]。 #### 函数原型 ```c void HAL_GPIO_EXTI_ClearIT(uint16_t GPIO_Pin); ``` 参数说明: - `GPIO_Pin`: 表示要清除哪个引脚对应的中断挂起位。此参数应指定具体的 GPIO 引脚编号,例如 `GPIO_PIN_13`. #### 实际应用中的使用方法 下面是一个典型的例子来展示如何在一个中断服务例程里调用这个函数: 假设配置了 PA0 作为外部中断源,则可以在定义好的 IRQ Handler 内部这样写: ```c void EXTI0_IRQHandler(void){ /* 检查是否是PA0产生的中断 */ if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0)){ // 执行用户自定义的操作 /* 清除PA0的中断标志位 */ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); // 或者也可以通过更高层次API实现相同功能 HAL_GPIO_EXTI_ClearIT(GPIO_PIN_0); } } ``` 上述代码片段展示了两种方式可以用来清除中断标志位:一种是直接操作寄存器的方式 (`__HAL_GPIO_EXTI_CLEAR_IT`);另一种则是利用 HAL 提供的功能更抽象的方法 (`HAL_GPIO_EXTI_ClearIT`). 推荐采用后者因为其具有更好的可移植性易读性.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机小混子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值