# 按键输入

GPIO 作为输入使用

# 抖动

特点:闭合和断开的时候都会出现

时长:5-10ms

消抖方式:

  • 软件消抖:
    • 延时:检测到按键按下后进行 10ms 延时再检测
  • 硬件消抖:
    • RC 滤波,平滑毛刺

# 寄存器

# GPIO 端口输入寄存器 IDR

电路结构:与施密特触发器连接,外部电平(模拟量)转换为数字的 0 和 1

施密特触发器:上临界和下临界电压,高于上临界为 1,低于下临界为 0,两个阈值中间不改变值

每一个 GPIO 有一个 IDR,16 位分别对应一个 GPIO 的 16 个引脚

# HAL 函数

# 读引脚

1
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

GPIOx 可以是 GPIOA … G

GPIO_Pin 可以是 GPIO_PIN_0 … 15

函数的变量输入是相关的宏定义

# 时钟配置

1
__HAL_RCC_GPIOX_CLK_ENABLE();

# 初始化结构体

1
2
GPIO_InitTypeDef gpio_init_struct;//初始化结构体
HAL_GPIO_Init(GPIOx, &gpio_init_struct);

# 结构体成员

  • Pin 对应的引脚 0 -15
  • Mode 模式 输入 / 输出
  • Pull 上拉 / 下拉
  • Speed 速度:高速、低速

# 上拉与下拉区别

上面那副图是板载的按钮的原理图,右侧接到 GPIO 的端口

上拉:向端口内看,经过一个电阻接到 VDD,当没有信号输入时,高电平,无法区分输入高电平和无信号输入的情况

下拉:向端口内看,经过一个电阻接到 GND,当没有信号输入时,低电平,无法区分输入低电平和无信号输入的情况

结合上述知识,WK_UP 应下拉输入,KEY0-2 上拉输入

浮空输入:不接上拉或下拉电阻,当没有信号输入时,电平不确定

模拟输入:信号不经过施密特触发器

# CUBEMX

点选引脚,选择 GPIO_Input

配置上下拉

配置 label(多了一个用户宏定义 在 main.h 中会进行宏定义,把 label 映射到相应的 GPIO Port 和 Pin)