1. 模块简介
按键(Key)
是 STM32 嵌入式系统中常用的 输入控制接口 ,广泛用于 人机交互、状态切换、系统调试 等。
在实际项目开发中,按键模块
具有如下典型用途:
- 用户输入控制(如模式切换、启动/停止命令)
- 嵌入式系统调试(触发中断/测试响应)
- 多功能界面导航(与OLED、LCD配合使用)
- 控制逻辑状态(例如设置时间、调整参数)

2. 原理解析
2.1 硬件工作原理
按键
依赖于 机械触点开闭 控制电平变化工作。STM32 通过检测 GPIO 输入电平(高/低)来判断按键是否被按下。

一般来说,按键一端接 GND,另一端接 STM32 的 IO 口,利用 上拉电阻 实现默认高电平,按下时电平变为低,形成"低电平有效"。

2.2 电路连接示意(如适用)
plaintext
STM32 GPIO (如PA0) --- 按键 --- GND
|
[10KΩ]
|
VCC

说明:
- GPIO 默认配置为 输入上拉,确保未按下时为高电平。
- 建议外部加 10KΩ 上拉电阻(部分开发板已内置)。
- 可使用 0.1μF 电容+1KΩ 串联 RC 滤波 减缓抖动影响。
3. 外设配置思路
3.1 涉及外设资源
外设名称 | 用途说明 |
---|---|
GPIO | 检测按键电平变化 |
外部时钟 | 可选(如使用定时器) |
3.2 配置步骤概述
-
开启相关外设时钟:
- 使用
RCC_APB2PeriphClockCmd
启用 GPIO 外设的时钟。
- 使用
-
配置 GPIO 引脚为输入上拉模式:
- 使用
GPIO_InitTypeDef
配置引脚为上拉输入模式。
- 使用
-
延时消抖:
- 为了避免因按键接触不良引起的抖动,添加延时函数进行消抖。
4. 驱动代码实现
4.1 按键初始化
c
void Key_Init(void)
{
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 输入上拉模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11; // 配置PB1和PB11为按键输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); // 应用GPIO配置
}
4.2 按键获取函数
c
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0; // 默认键码值为0
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) // 检测PB1的输入电平
{
Delay_ms(20); // 延时消抖
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); // 等待按键松开
Delay_ms(20); // 再次消抖
KeyNum = 1; // 设置按键码为1
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) // 检测PB11的输入电平
{
Delay_ms(20); // 延时消抖
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); // 等待按键松开
Delay_ms(20); // 再次消抖
KeyNum = 2; // 设置按键码为2
}
return KeyNum; // 返回按键码,若没有按键按下,则返回0
}
5. 功能扩展
5.1 多键支持
通过增加更多的 GPIO 引脚配置,可以支持更多的按键。例如,可以在配置中增加更多按键的检测,并返回不同的键码值。
5.2 中断模式
若需要避免轮询方式,可以将按键设置为外部中断模式,通过按键的状态变化触发中断,提升系统效率。
6. 调试要点
- 按键去抖问题:按键常常由于机械接触问题产生抖动,建议加入适当的延时消抖,或者使用硬件去抖电路。
- 中断方式优化:如果需要频繁响应按键操作,可以考虑将按键配置为外部中断模式,避免轮询带来的性能消耗。