当前位置: 首页 > news >正文

STM32HAL 快速入门(六):GPIO 输入之按键控制 LED

STM32HAL 快速入门(六):GPIO 输入之按键控制 LED

前言

大家好,这里是 Hello_Embed。GPIO 不仅能输出电平控制外设,还能通过输入模式读取外部信号 —— 本篇先从 “按键控制 LED” 开始,学习 GPIO 输入的基础用法,下一篇将进阶到 “光敏传感器控制蜂鸣器”,逐步掌握不同输入场景的处理。

一、调试器连接问题解决

在调试时,可能会遇到 STM32 与调试器无法连接的情况,报错如下:
请添加图片描述
可在 CubeMX 中修改配置解决:进入 “Pinout & Configuration”→“System Core”→“SYS”,将 “Debug” 选项从 “No Debug” 改为 “Serial Wire”,具体步骤如图:
请添加图片描述
具体原理此处不展开,读者可自行探究,我们回到 GPIO 输入的实战。

二、按键控制 LED 的实现

GPIO 输入模式的核心是 “读取外部信号电平”,以按键为例,我们需要通过引脚读取按键的按下 / 松开状态,再控制 LED 的亮灭。

1. 机械按键的特性与消抖需求

按键是机械开关,按下时触点会短暂弹跳,导致电平在高低之间快速波动(即 “抖动”),直接读取会产生误判。因此,需要通过 “消抖” 处理(如延时)确保信号稳定。

2. 硬件电路搭建

在面包板上搭建电路,连接按键与 STM32:
请添加图片描述

  • 面包板上下端通过电阻接入 VCC 和 GND,提供电源;
  • 按键一端连接 PB14 引脚,另一端连接 VCC,原理图如下:
    请添加图片描述
3. CubeMX 配置 PB14 为输入模式

按键未按下时,PB14 引脚悬空(电平不确定),需配置为下拉输入(启用内部下拉电阻):

  • 未按下时,下拉电阻将 PB14 拉至低电平(0V);
  • 按下时,VCC 通过按键将 PB14 拉高(3.3V),状态明确。
    配置步骤:在 CubeMX 中选择 PB14,设置为 “GPIO_Input”,并选择 “Pull-down”(下拉):
    请添加图片描述
    同时确保 PC13 已按之前的配置设为推挽输出(控制 LED),生成工程。
4. 代码实现:读取按键状态控制 LED

通过HAL_GPIO_ReadPin函数读取 PB14 的电平状态,再用HAL_GPIO_WritePin控制 PC13(LED)。

(1)基础代码(带消抖)
while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 */GPIO_PinState state;  // 存储按键状态state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14);  // 读取PB14电平HAL_Delay(20);  // 延时20ms消抖,过滤机械抖动if (state == GPIO_PIN_SET)  // 按键按下(高电平),LED点亮(低电平)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);else  // 按键松开(低电平),LED熄灭(高电平)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);/* USER CODE END 3 */
}

HAL_GPIO_ReadPin函数的功能如图(返回引脚的高低电平):
请添加图片描述
返回值类型GPIO_PinState是枚举类型,仅包含GPIO_PIN_RESET(0)和GPIO_PIN_SET(1):

typedef enum
{GPIO_PIN_RESET = 0u,GPIO_PIN_SET
} GPIO_PinState;

加入HAL_Delay(20)后,可稳定读取按键状态,LED 能正常响应按键操作:
请添加图片描述

(2)简化代码(反向控制)

一行代码可实现相反效果(按键按下 LED 灭,松开 LED 亮):

while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 */// 直接将PB14的状态作为PC13的输出值HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14));/* USER CODE END 3 */
}
  • 效果相反的原因:LED 是 “低电平点亮”,而按键按下时 PB14 为高电平,直接传递状态会导致 LED 在按键按下时熄灭;
  • 不能用~取反的原因:HAL_GPIO_ReadPin返回的是枚举类型,而非整数,取反操作不适用。
结尾

本文通过 “按键控制 LED” 掌握了 GPIO 输入模式的基础用法:配置下拉输入、用HAL_GPIO_ReadPin读取电平、通过延时消抖处理机械抖动。这些是处理数字输入信号的核心技巧。
下一篇笔记,我们将进一步探索 GPIO 输入的应用 —— 用光敏电阻(模拟信号)控制蜂鸣器,学习如何处理连续变化的输入信号。Hello_Embed 继续带你深入 GPIO 的实用场景,敬请期待~

http://www.xdnf.cn/news/1290871.html

相关文章:

  • JMeter 测试 WebSocket 接口的详细教程
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • 实战多屏Wallpaper壁纸显示及出现黑屏问题bug分析-学员作业
  • 从0开始配置conda环境并在PyCharm中使用
  • 基于Apache Flink的实时数据处理架构设计与高可用性实战经验分享
  • Flink中的窗口
  • 解决程序连不上RabbitMQ:Attempting to connect to/access to vhost虚拟主机挂了的排错与恢复
  • Windows也能用!Claude Code硬核指南
  • 【报错解决】Conda - Downloaded bytes did not match Content-Length
  • Java零基础笔记16(Java编程核心:存储读写数据方案—File文件操作、IO流、IO框架)
  • 搜索引擎核心机制解析
  • 5.0.9.1 C# wpf通过WindowsFormsHost嵌入windows media player(AxInterop.WMPLib)
  • C# WPF本地Deepseek部署
  • 集成电路学习:什么是CV计算机视觉
  • IPA1299至为芯替代TI ADS1299的脑机接口芯片
  • 网络安全合规6--服务器安全检测和防御技术
  • 高级IO(五种IO模型介绍)
  • Spring、Spring MVC、Spring Boot与Spring Cloud的扩展点全面梳理
  • Spring Boot 集成 机器人指令中枢ROS2工业机械臂控制网关
  • 从“存得对”到“存得准”:MySQL 数据类型与约束全景指南
  • 算法题打卡力扣第11题:盛最多水的容器(mid)
  • 音视频处理新纪元:12款AI模型的语音转录和视频理解能力横评
  • 洛谷 P2607 [ZJOI2008] 骑士-提高+/省选-
  • 从钢板内部应力视角,重新认识护栏板矫平机
  • 猫头虎AI分享| 智谱开源了为 RL scaling 设计的 LLM post‑training 框架用于GLM-4.5强化学习训练:slime
  • 深入解析C语言嵌套结构体的内存管理与操作实践
  • 基于CNN与Transformer的无人机应急救援网络异常流量检测
  • 在前端js中使用jsPDF或react-to-pdf生成pdf文件时,不使用默认下载,而是存储到服务器
  • SQL详细语法教程(一)--数据定义语言(DDL)
  • Android SurfaceView TextureView