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)基础代码(带消抖)
c 复制代码
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):

c 复制代码
typedef enum
{
  GPIO_PIN_RESET = 0u,
  GPIO_PIN_SET
} GPIO_PinState;

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

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

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

c 复制代码
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 的实用场景,敬请期待~

相关推荐
MarkHD4 小时前
智能体在车联网中的应用:第51天 模仿学习与离线强化学习:破解数据效率与安全困局的双刃剑
学习·安全
Drawing stars6 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
崇山峻岭之间6 小时前
Matlab学习记录33
开发语言·学习·matlab
玄〤7 小时前
黑马点评中 VoucherOrderServiceImpl 实现类中的一人一单实现解析(单机部署)
java·数据库·redis·笔记·后端·mybatis·springboot
科技林总7 小时前
【系统分析师】3.5 多处理机系统
学习
ytttr8738 小时前
基于STM32和W5500芯片的Modbus TCP协议栈实现
stm32·嵌入式硬件
上大科技蔡生8 小时前
CS5715:2.7V~26V宽输入,单节锂电池适用,最高36V输出,省掉电感电流检测电阻,软启动时间可调,异步升压DCDC控制器
单片机·嵌入式硬件·dcdc
芯思路9 小时前
STM32开发学习笔记之三【按键】
笔记·stm32·学习
CQ_YM9 小时前
51单片机(1)
单片机·嵌入式硬件·51单片机
Lips6119 小时前
2026.1.11力扣刷题笔记
笔记·算法·leetcode