# 按键输入
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 | GPIO_InitTypeDef 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)