1. GPIO输入基础与按键控制原理
在嵌入式系统开发中,GPIO(General Purpose Input/Output)是连接微控制器与外部世界的最基础、最频繁使用的接口。当GPIO配置为输入模式时,其核心任务是可靠地感知外部电平状态——这看似简单,实则暗藏工程细节。尤其在处理机械按键这类典型人机交互器件时,若仅做“读取一次电平→执行动作”的粗放处理,几乎必然遭遇误触发、状态抖动、逻辑错乱等问题。本节将从硬件电路本质出发,结合STM32的GPIO内部结构特性,系统性地拆解按键输入的完整实现路径。
1.1 按键的物理特性与抖动成因
机械按键的本质是一组金属触点。当按下或释放时,触点并非瞬间完成稳定闭合或断开,而是在接触/分离的临界点发生多次微秒级的弹跳(Bounce)。该过程持续时间通常为5–20ms,具体取决于按键材质、弹簧力度及老化程度。对于STM32F103这类主频72MHz的MCU,一个机器周期约14ns,20ms即相当于140万次指令周期——足够执行大量无意义的重复判断。
这种物理抖动直接反映在GPIO引脚上:理想状态下,按键松开→高电平;按下→低电平;松开→高电平。实际波形则呈现为一段密集的高低电平交替脉冲序列。若程序在抖动窗口内连续读取,可能捕获到“高→低→高→低→高”的虚假序列,导致单次按键被识别为多次操作。
1.2 硬件消抖:上拉/下拉电阻的作用机制
解决抖动问题的第一道防线是硬件设计。学习板原理图中K1与K2均采用经典RC消抖电路,其核心在于明确引脚在“悬空”状态下的确定电平。
以K1为例:PB12引脚通过10kΩ电阻连接至3.3V电源,按键另一端接地。当按键未按下时,PB12经10kΩ电阻上