按键上下拉说明

Tutorial: 电子电路 Category: 嵌入式 Published: 2026-08-29 08:09:36 Views: 0 Likes: 0 Comments: 0

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_UPPA03.3 V下拉输入0 / 1
KEY0PE4GND上拉输入1 / 0
KEY1PE3GND上拉输入1 / 0
KEY2PE2GND上拉输入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 初始化完成后再读取,并对首次状态与按键抖动做处理。