按键上下拉说明
101.2.4按键上下拉说明
一、按键设置
PE3/KEY1 与 PE4/KEY2 的板载按键一端接 GPIO,另一端接 GND。输入端必须在按键松开时也有确定电平,因此配置为内部上拉:
STM32F103 内部 开发板
3.3 V ──[弱上拉电阻]──┬── 输入缓冲 ──> IDR
│
└── PE3/PE4 ── 按键 ── GND
松开:线路不通,弱上拉把引脚保持为 1
按下:按键把引脚连接到 GND,引脚读 0
这类按键是“低电平有效”。代码判断 GPIO_PIN_RESET 表示按下,并不表示 MCU 被复位;RESET 在这里是 GPIO 位值为 0。
若配置为浮空输入,松开时引脚呈高阻,没有稳定的充放电路径。人体、电源纹波、相邻走线和输入电容都可能改变电压,使施密特输入随机读到 0 或 1。实验中蜂鸣器无规律翻转,就是浮空与循环检测共同造成的结果。
内部上拉是弱电阻。按键按下时电流近似为:
$I_{key}\approx\frac{3.3\text{ V}}{R_{pullup}}$
它足以确定逻辑电平,又不会让按键短接大电流。内部上拉阻值容差较大;长线、强干扰、低功耗或高速要求下,应按数据手册范围设计外部电阻和滤波。
按键还存在机械抖动。上拉只解决“默认电平”,不能代替消抖。可靠的软件输入链是:
flowchart LR
PAD[引脚电压] --> SCHMITT[施密特触发器]
SCHMITT --> SAMPLE[周期采样]
SAMPLE --> FILTER[连续稳定计数/状态机]
FILTER --> EDGE[确认按下沿]
EDGE --> ACTION[只执行一次动作]
二、电路图按键
开发板的四个用户按键并非全部同一接法:
| 按键网络 | MCU 引脚 | 按下连接到 | 推荐输入模式 | 松开/按下 |
|---|---|---|---|---|
WK_UP | PA0 | 3.3 V | 下拉输入 | 0 / 1 |
KEY0 | PE4 | GND | 上拉输入 | 1 / 0 |
KEY1 | PE3 | GND | 上拉输入 | 1 / 0 |
KEY2 | PE2 | GND | 上拉输入 | 1 / 0 |
课程口述中一度出现“PE0”,结合原理图和芯片网络名,正确引脚是 PA0/WK_UP。
WK_UP(高电平有效)
3.3 V ── 按键 ── PA0 ──[内部弱下拉]── GND
松开:PA0=0 按下:PA0=1
KEY0/1/2(低电平有效)
3.3 V ──[内部弱上拉]── PE4/PE3/PE2 ── 按键 ── GND
松开:GPIO=1 按下:GPIO=0
四脚轻触按键常让初学者误判。它的同侧两脚内部永久相连,按下时才把左右两侧接通:
未按下 按下
1 ─── 2 1 ─── 2
│ │
3 ─── 4 3 ─── 4
1、2 属于同一侧;3、4 属于另一侧。
原理图虽然画四个脚,电气功能等效于一个两端开关。
上下拉的选择原则不是“按键一律上拉”,而是让松开状态稳定,并让按下后不会发生电源短路:
flowchart TD
Q{按键按下接哪里?}
Q -- GND --> UP[输入上拉\n松开1 按下0]
Q -- VDD --> DOWN[输入下拉\n松开0 按下1]
Q -- 外部电路主动驱动 --> SPEC[按外部输出类型选择\n推挽可无上下拉\n开漏通常需要上拉]
如果 PA0 错设为上拉,松开和按下都可能读到高电平,无法区分;如果 PE3 错设为下拉,松开和按下都可能读到低电平。若外部强驱动与内部上下拉方向相反,通常不会因弱电阻而损坏,但会产生静态电流并让逻辑含义混乱。
还要注意上电时序:复位后大多数 GPIO 默认浮空输入,内部上下拉要等程序完成配置后才生效。若某个按键/控制信号在启动阶段也必须稳定,可增加板外上拉或下拉。软件中则应在 GPIO 初始化完成后再读取,并对首次状态与按键抖动做处理。