1. 状态机在按键识别中的核心价值
第一次接触蓝桥杯嵌入式比赛时,最让我头疼的就是按键处理。传统轮询方式虽然简单,但面对短按、长按、双击等复合操作时,代码很快就会变成一团乱麻。直到学会状态机(Finite State Machine,FSM)设计方法,才发现原来按键处理可以如此优雅。
状态机本质上是对事物行为模式的数学建模。以按键为例,我们可以将其生命周期划分为几个明确阶段:初始状态、按下确认、持续计时、释放等待等。每个状态都有明确的进入条件和迁移路径。这种设计最大的优势在于逻辑可视化——通过状态转移图就能理清所有判断分支,完全避免了传统if-else嵌套带来的"面条代码"问题。
在资源受限的STM32G431开发板上(蓝桥杯嵌入式指定平台),状态机实现尤其重要。通过合理设计状态变量,我们仅需1个字节就能完整记录按键行为轨迹。实测对比显示,相比传统轮询方案,状态机实现的代码体积减少约30%,RAM占用降低50%以上,这对于仅有128KB Flash和32KB SRAM的芯片至关重要。
2. 硬件环境与基础配置
2.1 开发板按键电路分析
蓝桥杯嵌入式开发板通常配备4个独立按键(B1-B4),电路设计采用上拉电阻方案。当按键未按下时,GPIO口通过10kΩ电阻连接到VCC,读取为高电平;按下时直接接地变为低电平。这种设计带来两个关键特性:
- 按键按下时信号抖动明显,通常持续5-15ms
- 释放时存在类似的反弹抖动现象
硬件消抖虽然简单(如并联电容),但会降低响应速度。更推荐软件消抖方案,这也是我们采用定时器中断扫描的原因。根据实测数据,0.01s(10ms)的扫描间隔既能有效消除抖动,又不会丢失快速操作信号。
2.2 定时器基础配置
使用STM32CubeMX配置TIM4作为按键扫描定时器:
- 时钟源选择内部时钟(Internal Clock)
- 分频系数(Prescaler)设置为79(基于80MHz主频)
- 自动重装载值(Counter Peri

&spm=1001.2101.3001.5002&articleId=95094334&d=1&t=3&u=08aae83987254cbca724419ee6ac7907)

被折叠的 条评论
为什么被折叠?



