STM32 HAL库开发学习7. GPIO输入与中断配置

STM32 HAL库开发学习7. GPIO输入与中断配置在 STM32 中 GPIO 的输入模式直接影响信号检测的稳定性和可靠性 主要包含以下三种配置 浮空输入 例如 PA0 PB0 PC0 共享 EXTI0 中断线

欢迎大家来到IT世界,在知识的湖畔探索吧!

一、GPIO输入模式基础

在STM32中,GPIO的输入模式直接影响信号检测的稳定性和可靠性,主要包含以下三种配置:

浮空输入(GPIO_MODE_INPUT_FLOATING)

引脚直接连接内部施密特触发器,无上下拉电阻,适用于外部已有明确电平的场景(如接外部上拉电路)。

上拉输入(GPIO_MODE_INPUT_PULLUP)

内部上拉电阻(约40kΩ)使引脚默认保持高电平,适合检测低电平有效的信号(如按键按下接地)。

下拉输入(GPIO_MODE_INPUT_PULLDOWN)

内部下拉电阻(约40kΩ)使引脚默认保持低电平,适合检测高电平有效的信号(如传感器触发高脉冲)。

关键代码:配置GPIO输入模式

cGPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉输入 GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 1

欢迎大家来到IT世界,在知识的湖畔探索吧!

二、外部中断(EXTI)机制详解

STM32的 EXTI(External Interrupt) 模块可将GPIO信号转换为中断事件,实现实时响应。中断触发分成三种类型:

  • 上升沿触发:GPIO从低→高跳变时触发
  • 下降沿触发:GPIO从高→低跳变时触发
  • 双边沿触发:任意跳变均触发

硬件映射规则
EXTI线与GPIO引脚存在固定映射关系(参考《STM32F4参考手册》表14)。例如:

PA0、PB0、PC0 共享 EXTI0 中断线
需通过 SYSCFG_EXTILineConfig() 函数选择具体引脚源。

三、实战:按键中断控制LED

3.1 CubeMX配置步骤

新建工程,选择开发板对应的芯片,双击型号:

STM32 HAL库开发学习7. GPIO输入与中断配置

欢迎大家来到IT世界,在知识的湖畔探索吧!

按键引脚设置

我的开发板上 KEY_UP 接了上拉电阻:

STM32 HAL库开发学习7. GPIO输入与中断配置


使用PA0引脚,设置为GPIO_EXTIx模式:

STM32 HAL库开发学习7. GPIO输入与中断配置

LED引脚设置

开发板PC0接LED1,设为推挽输出模式:

STM32 HAL库开发学习7. GPIO输入与中断配置

配置NVIC:

勾选对应的EXTI0中断通道并设置占优先级和子优先级:

STM32 HAL库开发学习7. GPIO输入与中断配置

项目设置

STM32 HAL库开发学习7. GPIO输入与中断配置

生成代码并添加用户逻辑,使用Keil打开生成的工程。

3.2 中断代码实现

欢迎大家来到IT世界,在知识的湖畔探索吧!/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { // 当检测到高电平时点亮LED(按键按下) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)); // 引脚状态直接映射到LED } } /* USER CODE END 4 */ 

效果是:按下KEY_UP,LED1点亮。

3. 程序执行流程

(1)硬件中断触发

当PA0检测到配置的边沿信号(上升沿/下降沿)时,触发EXTI0中断。

(2)中断服务函数调用

CPU自动跳转到中断向量表,执行CubeMX生成的EXTI0_IRQHandler(位于stm32f1xx_it.c)。

void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ /* USER CODE END EXTI0_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); /* USER CODE BEGIN EXTI0_IRQn 1 */ /* USER CODE END EXTI0_IRQn 1 */ } 

(3)HAL库处理层

HAL_GPIO_EXTI_IRQHandler 实现如下关键操作:

欢迎大家来到IT世界,在知识的湖畔探索吧!void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) // 检查中断标志 { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); // 清除中断标志 HAL_GPIO_EXTI_Callback(GPIO_Pin); // 调用用户回调函数 } } 

(4)用户回调执行

/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 用户自定义的中断处理逻辑 } /* USER CODE END 4 */

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/113288.html

(0)
上一篇 5小时前
下一篇 4小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信