【西门子杯工业嵌入式-3-如何使用KEY】
西门子杯工业嵌入式-3-如何使用KEY
- 一、课程概述
- 1.1 本讲主题
- 1.2 学习目标
- 二、GPIO输入原理与按键特性
- 2.1 常开按键工作方式
- 2.2 按键抖动现象
- 2.3 消抖方式
- 三、实验功能设计
- 3.1 控制逻辑描述
- 3.2 引脚资源分配
- 四、程序结构与文件组织
- 4.1 文件模块划分
- 五、关键代码解析
- 5.1 宏定义(key.h & led.h)
- 5.2 按键初始化(key.c)
- 5.3 按键状态读取(含软件消抖)
- 5.4 LED控制逻辑(function.c 中主循环)
- 六、项目配置与调试要点
- 6.1 工程结构管理
- 6.2 断电操作提示
- 七、实验效果演示
- 7.1 实验现象
- 八、课程总结与思考
- 8.1 本讲收获
- 8.2 思考题
链接: B站视频
一、课程概述
1.1 本讲主题
本讲主要讲解如何将GD32F4的GPIO口作为输入端使用,通过读取按键的状态控制LED灯的开关,实现基本的人机交互控制逻辑。
1.2 学习目标
了解GPIO输入的基本原理。
学会处理按键抖动问题(软件消抖)。
掌握使用GPIO读取按键状态的方法。
实现3个按键控制2个LED的实验功能。
熟悉结构化编程方式(文件模块化、宏定义管理硬件资源)。
二、GPIO输入原理与按键特性
2.1 常开按键工作方式
按键在未按下时是断开的,按下时闭合。
所以在未按下时,GPIO引脚读取到的是高电平。
按下后,通过拉低引脚,读取到的是低电平。
2.2 按键抖动现象
按键在闭合或断开的瞬间会出现快速抖动(机械弹性引起)。
抖动持续时间约为5ms~20ms,导致读取状态不稳定。
必须采取消抖处理以确保程序逻辑的准确性。
2.3 消抖方式
硬件消抖:通过电容、RC电路过滤抖动(更稳定但成本增加)。
软件消抖:程序中加入延时避开抖动阶段(本实验使用)。
检测到按下状态 → 延时 → 再次确认状态 → 返回有效状态。
加入等待松手逻辑,防止按住不放被重复触发。
三、实验功能设计
3.1 控制逻辑描述
使用三个独立按键控制两个LED灯的状态:
按键 功能描述 控制对象
按键 | 功能描述 | 控制对象 |
---|---|---|
K1 | 状态翻转(亮↔灭) | LED1 |
K2 | 点亮LED | LED2 |
K3 | 熄灭LED | LED2 |
![]() |
3.2 引脚资源分配
自定义5个GPIO端口:
2个用于LED输出。
3个用于按键输入。
所有定义通过宏定义在头文件中实现,便于管理与移植。
四、程序结构与文件组织
4.1 文件模块划分
文件名 | 功能描述 |
---|---|
key.h / key.c | 按键 GPIO 初始化与状态读取 |
led.h / led.c | LED 初始化与控制逻辑 |
function.c | 主循环控制逻辑 |
五、关键代码解析
5.1 宏定义(key.h & led.h)
为每个按键和LED定义宏,例如:
#define KEY1_PIN GPIO_PIN_0
#define KEY1_PORT GPIOA
#define LED1_PIN GPIO_PIN_5
#define LED1_PORT GPIOB
5.2 按键初始化(key.c)
void key_init(void) {rcu_periph_clock_enable(RCU_GPIOA); // 启用端口时钟gpio_init(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, KEY1_PIN | KEY2_PIN | KEY3_PIN);
}
5.3 按键状态读取(含软件消抖)
uint8_t key_state(uint16_t pin, uint32_t port) {if (gpio_input_bit_get(port, pin) == RESET) {delay_1ms(10); // 软件延时消抖if (gpio_input_bit_get(port, pin) == RESET) {while (gpio_input_bit_get(port, pin) == RESET); // 等待释放return 1;}}return 0;
}
5.4 LED控制逻辑(function.c 中主循环)
while (1) {if (key_state(KEY1_PIN, KEY1_PORT)) {gpio_bit_toggle(LED1_PORT, LED1_PIN);}if (key_state(KEY2_PIN, KEY2_PORT)) {gpio_bit_set(LED2_PORT, LED2_PIN);}if (key_state(KEY3_PIN, KEY3_PORT)) {gpio_bit_reset(LED2_PORT, LED2_PIN);}
}
六、项目配置与调试要点
6.1 工程结构管理
在 Hardware 文件夹下建立 key 文件夹。
创建并加入 key.c 和 key.h 文件到工程中。
添加头文件引用路径,确保编译器能找到新建文件。
6.2 断电操作提示
在断电状态下拔插杜邦线,以免损坏MCU引脚。
七、实验效果演示
7.1 实验现象
按下按键1:LED1状态翻转。
按下按键2:LED2点亮。
按下按键3:LED2熄灭。
八、课程总结与思考
8.1 本讲收获
学会将GPIO作为输入使用。
理解并实现软件消抖处理。
掌握结构化文件编写和端口宏定义方法。
实现基础的按键控制LED功能。
8.2 思考题
如果使用GD32开发矩阵键盘,与在51单片机上实现有什么不同?
提示方向:考虑两者的GPIO资源、扫描方法、中断处理能力、处理效率等差异。