【STM32CubeMX(3)】GPIO上拉输入——读取按键状态

本文介绍了如何在STM32CubeMX6.10.0和MDK-ARM5.32环境下,配置GPIO上拉输入,以控制LED灯的切换,并通过示例展示了如何使用延时消抖处理按键输入。

通过本节可以学习到:

  • 如何在CubeMX配置上拉输入
  • 什么是上拉输入
  • 如何读取一个GPIO的输入状态

软件环境:

STM32CubeMX version6.10.0
Keil_v5(MDK-ARM) version 5.32

硬件环境:

STM32F103C8T6最小系统板(所有STM32通用下文操作)

关于上拉输入

GPIO上拉输入是一种输入模式,用于连接外部设备到微控制器或单片机的GPIO引脚上。当GPIO引脚处于上拉输入模式时,如果外部设备未连接到该引脚或者外部设备处于高阻态时,微控制器内部会通过一个较大的电阻(上拉电阻)将引脚拉高到逻辑高电平(一般为VCC电压),以确保引脚的电平为确定的逻辑状态。这样设计的目的是为了避免引脚漂移或噪声导致的不确定状态。

与上拉输入相对应的是下拉输入,它与上拉输入的原理类似,但是在外部设备未连接或处于高阻态时,微控制器内部会通过一个较大的电阻(下拉电阻)将引脚拉低到逻辑低电平(一般为地电压)。

如果GPIO引脚既不采用上拉输入也不采用下拉输入,那么它就是一个普通的输入引脚,需要外部设备提供明确的电平信号,否则引脚的状态将是不确定的,容易受到外部干扰的影响。

总的来说,上拉输入、下拉输入和普通输入之间的区别在于微控制器在引脚未连接外部设备或外部设备处于高阻态时,微控制器内部如何拉高或拉低引脚的电平以确保引脚的电平状态。

1、通过CubeMX完成外设初始化

基于【STM32CubeMX(1)】GPIO推挽输出——点亮第一个LED灯继续实现按键的输入状态判断,因此其他配置请移步。
在这里插入图片描述

2、通过MDK-ARM完成外设功能实现

本节仅是验证上拉输入实现按键控制LED灯的翻转,故按键判断采用低效的CPU延时消抖

if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==GPIO_PIN_RESET)//按键被按下
		{
			HAL_Delay(10);//延时消抖
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==GPIO_PIN_RESET)
			{
				while(1){
					HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
					HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
					HAL_Delay(100);
				}
			}
		}	

在这里插入图片描述
3、单片机效果演示
在这里插入图片描述

<think>我们正在使用STM32CubeMX配置STM32F407的GPIO输入模式,用于读取按键或其他数字输入信号。 步骤: 1. 打开STM32CubeMX,创建新工程,选择STM32F407芯片。 2. 配置系统核心(SYS)中的调试接口(如Serial Wire)。 3. 配置GPIO引脚为输入模式。 4. 根据硬件设计配置GPIO的具体参数(如上拉/下拉、中断等)。 5. 生成代码,然后在生成的代码中读取GPIO状态。 详细步骤: 1. 创建工程: - 启动STM32CubeMX,点击“New Project”。 - 在芯片选择器中输入STM32F407”,选择你的具体型号(如STM32F407ZGTx),然后点击“Start Project”。 2. 系统配置(SYS): - 在“System Core”中选择“SYS”,在“Debug”下拉菜单中选择“Serial Wire”(如果使用ST-Link调试器,需要此配置)。 3. 配置GPIO输入: - 在芯片引脚图上找到你想配置为输入GPIO(例如PA0),点击该引脚,选择“GPIO_Input”。 - 或者,在左侧的“Pinout & Configuration”选项卡中,展开“System Core”下的“GPIO”,然后点击需要配置的引脚,在右侧的配置面板中设置模式为输入模式(Input Mode)。 4. 配置GPIO参数: - 在“GPIO”配置中,选择你配置的输入引脚(如PA0),在右侧的配置面板中: - GPIO mode: Input Mode - GPIO Pull-up/Pull-down: 根据硬件电路选择: - 如果按键连接在引脚和地之间,则选择“Pull-up”(上拉电阻),这样按键未按下时引脚为高电平,按下时为低电平。 - 如果按键连接在引脚和电源之间,则选择“Pull-down”(下拉电阻),这样按键未按下时引脚为低电平,按下时为高电平。 - 如果不需要中断,则“GPIO mode”保持为“Input mode”,不需要开启中断。 - 如果需要中断(例如按键按下触发中断),则选择“External Interrupt Mode with Rising/Falling edge trigger”(上升沿/下降沿触发的外部中断模式),然后在“NVIC”(嵌套向量中断控制器)中使能对应的中断线。 5. 时钟配置: - 在“Clock Configuration”选项卡中,配置系统时钟。通常使用HSE(外部高速晶振)和PLL来得到最高的系统时钟(如168MHz),但也可以使用默认的内部时钟(HSI)进行简单测试。 6. 生成代码: - 点击“Project Manager”选项卡,设置项目名称、存储路径、IDE(如MDK-ARM V5)等。 - 在“Code Generator”中,选择“Generate peripheral initialization as a pair of &#39;.c/.h&#39; files per peripheral”(推荐)。 - 点击“Generate Code”生成代码。 7. 在代码中读取GPIO状态: - 在生成的代码中,GPIO的初始化函数`MX_GPIO_Init`已经生成。 - 在需要读取GPIO状态的地方(例如主循环中),使用HAL库函数`HAL_GPIO_ReadPin`读取引脚状态。 - 示例: ```c if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { // 引脚为高电平 } else { // 引脚为低电平 } ``` 8. 如果配置了中断: - 在生成的代码中,中断服务函数已经自动生成,但回调函数需要用户实现。 - 在`stm32f4xx_it.c`文件中,已经定义了外部中断的中断服务函数(如`EXTI0_IRQHandler`),它会调用HAL库的中断处理函数。 - 用户需要重写`HAL_GPIO_EXTI_Callback`函数,该函数在中断发生时被调用。注意:这个函数是弱定义的,可以在用户文件中重新定义。 ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { // 处理PA0的中断 } } ``` 注意事项: - 确保硬件连接正确,例如按键一端接GPIO引脚,另一端接GND(上拉配置)或VCC(下拉配置)。 - 如果使用中断,注意中断优先级配置(在NVIC配置中设置)。 通过以上步骤,即可实现STM32F407的GPIO输入读取。</think>### STM32F407 CubeMX GPIO输入配置指南 以下是使用STM32CubeMX配置STM32F407 GPIO输入模式的完整步骤: #### 1. **创建工程** - 启动STM32CubeMX - 选择芯片型号:`STM32F407ZGTx`(或您的具体型号) - 在`Pinout & Configuration`选项卡中操作 #### 2. **配置GPIO引脚** 1. 在芯片引脚图上选择目标GPIO(例如PA0) 2. 设置模式:`GPIO_Input` 3. 配置参数: - **Pull-up/Pull-down**: - 按键接地:选择`Pull-up`(默认高电平,按下变低) - 按键接VCC:选择`Pull-down`(默认低电平,按下变高) - **用户标签**:右键引脚→`Enter User Label`→命名(如`USER_Btn`) #### 3. **系统配置** ```mermaid graph TD A[时钟配置] --> B[系统时钟树] B --> C[配置HCLK为168MHz] C --> D[保存配置] ``` #### 4. **生成代码** 1. 进入`Project Manager`选项卡 2. 设置: - IDE:选择您的开发环境(MDK-ARM/IAR/STM32IDE) - 勾选`Generate peripheral initialization as a pair of .c/.h` 3. 点击`GENERATE CODE` #### 5. **代码实现** 在生成的工程中: ```c /* 读取GPIO状态示例 */ #include "main.h" int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { // 读取PA0引脚状态 if(HAL_GPIO_ReadPin(USER_Btn_GPIO_Port, USER_Btn_Pin) == GPIO_PIN_SET) { // 高电平处理逻辑 } else { // 低电平处理逻辑 } HAL_Delay(10); // 去抖动延时 } } ``` #### 6. **GPIO初始化函数详解** 在`gpio.c`中自动生成的初始化代码: ```c void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* 配置PA0为输入模式 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; // 根据硬件选择上拉/下拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` #### 注意事项: 1. **硬件连接**:确保GPIO引脚未复用为其他功能(如JTAG) 2. **消抖处理**:机械按键需添加5-20ms延时去抖 3. **中断模式**(可选): - 在CubeMX中将模式改为`GPIO_EXITx` - 在`NVIC Configuration`中启用中断 - 实现中断回调函数: ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == USER_Btn_Pin) { // 中断处理逻辑 } } ``` > 重要提示:实际引脚编号需根据您的硬件原理图确定,常用按键引脚包括PA0、PC13等[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小谦·

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

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

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

打赏作者

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

抵扣说明:

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

余额充值