STM32CubeMX+HAL+Keil5 GPIO输入 按键控制

文章目录

  • [1 准备材料](#1 准备材料)
  • [2 实验目标](#2 实验目标)
  • [3 实验流程](#3 实验流程)
    • [3.0 前提知识](#3.0 前提知识)
    • [3.1 STM32CubeMX操作步骤](#3.1 STM32CubeMX操作步骤)
      • [3.1.0 工程基本配置](#3.1.0 工程基本配置)
      • [3.1.1 时钟树配置](#3.1.1 时钟树配置)
      • [3.1.2 外设参数配置](#3.1.2 外设参数配置)
    • [3.2 代码部分](#3.2 代码部分)
  • [4 烧录验证](#4 烧录验证)
  • [5 回顾总结](#5 回顾总结)

1 准备材料

2 实验目标

使用STM32CubeMX软件配置STM32F103C8T6开发板的按键作为输入,实现按键控制 LED 翻转,掌握GPIO输入部分

3 实验流程

3.0 前提知识

  1. GPIO 输入模式主要有:浮空输入、上拉输入、下拉输入。

    • 浮空输入:无内部上下拉,引脚电平随外部信号变化,无信号时电平不确定,易受干扰。(一般不选)

    • 上拉输入:内部电阻将引脚默认拉为高电平,外部接入低电平可拉低引脚。

    • 下拉输入:内部电阻将引脚默认拉为低电平,外部接入高电平可拉高引脚。

    为防止干扰与电平漂移,无源按键、开关等输入必须配置上拉或下拉,不建议浮空。

  2. 读取引脚电平使用 HAL_GPIO_ReadPin,返回 GPIO_PIN_SET(高) 或 GPIO_PIN_RESET(低)。

  3. 按键类输入通常需要软件消抖 一般为20ms ,避免机械抖动导致多次触发。

终极结论:

  • 按键输入 → 必须用上拉 / 下拉,不能浮空!

  • 输出推挽悬空最好


3.1 STM32CubeMX操作步骤

3.1.0 工程基本配置

3.1.1 时钟树配置

3.1.2 外设参数配置

在Pinout & Configuration页面右边单片机引脚预览Pinout view中,寻找需要设置的具体GPIO,这里我们选择PA0引脚,左键单击引脚将引脚功能设置为GPIO_Input

当 GPIO mode 选择Input mode时, GPIO Pull-up/Pull-down 可以选择无上/下拉、上拉和下拉

我们这里选择上拉

选择PA1引脚,左键单击引脚将引脚功能设置为GPIO_Output,用来控制led亮灭

GPIO output level 配置为 High ,初始电平高电平

GPIO mode 配置为 Output Push Pull ,推挽输出

GPIO Pull-up/Pull-down 配置为 No pull-up and no pull-down

推挽输出时引脚由强驱动 MOS 管控制,内部弱上下拉电阻无法改变输出电平,反而可能增加微小功耗,所以设为无上下拉最干净。

3.2 代码部分

源代码如下:

c 复制代码
	  // 检测按键是否按下(高电平表示按下)
	  if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
	  {
		HAL_Delay(20); // 延时消抖,跳过抖动区

		// 再次确认是否真的被按下
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
		{
		  // 翻转LED电平(PA1)
		  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); // 低电平点亮,高电平熄灭
		  // 等待按键松开,防止一次按下多次翻转
		  while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
		}
	  }

4 烧录验证

5 回顾总结

正常而言复位后led是灭的,但是第一次测试复位后led却是亮的

原因:第一次测试时我的代码逻辑如下,PA0 配置了下拉输入,不按按键默认就是低电平,代码上电,PA0为低电平,一旦检测到PA0为低电平,导致就触发翻转 LED。

c 复制代码
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) // 低电平 = 条件成立
{
    HAL_Delay(20);
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
    {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); // <--- 这里执行了!
    }
}

所以按照这个代码逻辑 PA0配置只能为上拉输入,不按按键默认高电平

相关推荐
szxinmai主板定制专家6 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB20268 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)10 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~10 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计11 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界12 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB202612 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥13 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源
服务器硬件项目经理14 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
一次调频AGCAVC14 小时前
一次调频系统控制柜的组成及一次调频装置主机功能详述
人工智能·嵌入式硬件