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

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

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

通过本节可以学习到:

  • 如何在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、单片机效果演示
在这里插入图片描述

### 使用 STM32CubeMX 配置 STM32F103RCT6 实现按键控制 LED 灯 #### 一、硬件准备 确保拥有如下材料: - 开发板:STM32F103RCT6 - USB 调试线缆 - 按键模块以及连接线若干 - LED 和限流电阻 #### 二、软件环境搭建 安装并打开最新版本的 STM32CubeMX 工具。 #### 三、创建新项目 启动 STM32CubeMX 后,在欢迎界面点击 "New Project" 创建一个新的工程文件,选择目标芯片型号为 `STM32F103RCT6` 并确认加载默认设置[^2]。 #### 四、配置时钟树与时基 进入 “Clock Configuration” 页面调整系统主频至72MHz;接着前往“Pinout & Configuration”,找到 RCC 中断源使能 TIMx 外设作为时间基准使用。 #### 五、GPIO端口初始化 在 Pinout 视图下完成 GPIO 的分配工作: - 将 PA0 设置成输入模式用于检测按钮状态; - PB5 设定为推挽输出方式来驱动外部接驳的小功率LED指示灯。 ```c // 初始化函数自动生成部分代码片段示意 void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; // 不上拉不下拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PB5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` #### 六、编写逻辑处理程序 编辑 main.c 文件加入必要的头文件声明及中断服务例程定义。在此基础上实现简单的读取开关量信号改变对应IO电平的操作流程。 ```c #include "main.h" int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1){ if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); }else { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); } HAL_Delay(100); // 添加适当延时防止抖动影响判断准确性 } } /** * @brief System Clock Configuration * @retval None */ static void SystemClock_Config(void){ ... } ``` 通过上述步骤即可利用 STM32CubeMX 完成基本外设功能开发前的基础准备工作,并实现了简单直观的人机交互效果展示——按下按键点亮/熄灭指定位置上的发光二极管元件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小谦·

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

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

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

打赏作者

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

抵扣说明:

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

余额充值