STM32 外设驱动模块三:按键(Key) 模块

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 配置步骤概述

  1. 开启相关外设时钟

    • 使用 RCC_APB2PeriphClockCmd 启用 GPIO 外设的时钟。
  2. 配置 GPIO 引脚为输入上拉模式

    • 使用 GPIO_InitTypeDef 配置引脚为上拉输入模式。
  3. 延时消抖

    • 为了避免因按键接触不良引起的抖动,添加延时函数进行消抖。

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. 调试要点

  1. 按键去抖问题:按键常常由于机械接触问题产生抖动,建议加入适当的延时消抖,或者使用硬件去抖电路。
  2. 中断方式优化:如果需要频繁响应按键操作,可以考虑将按键配置为外部中断模式,避免轮询带来的性能消耗。