当前位置: 首页 > news >正文

【西门子杯工业嵌入式-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点亮LEDLED2
K3熄灭LEDLED2
在这里插入图片描述

3.2 引脚资源分配

自定义5个GPIO端口:

2个用于LED输出。

3个用于按键输入。

所有定义通过宏定义在头文件中实现,便于管理与移植。

四、程序结构与文件组织

4.1 文件模块划分

文件名功能描述
key.h / key.c按键 GPIO 初始化与状态读取
led.h / led.cLED 初始化与控制逻辑
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资源、扫描方法、中断处理能力、处理效率等差异。

http://www.lqws.cn/news/211375.html

相关文章:

  • 垃圾回收相关八股
  • Redis内存淘汰策略
  • 【Linux】LInux下第一个程序:进度条
  • 东芝Toshiba e-STUDIO2110AC打印机信息
  • 数据结构算法(C语言)
  • Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然
  • 基于 Transformer robert的情感分类任务实践总结之二——R-Drop
  • altium designer2024绘制stm32过程笔记x`
  • WebRTC通话原理与入门难度实战指南
  • 从零开始制作小程序简单概述
  • Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
  • SDC命令详解:使用set_port_fanout_number命令进行约束
  • AIGC的产品设计演进:从工具到协作者
  • 生成模型从自回归到变分自动编码器
  • 提供MD5解密的网站
  • WaytoAGI东京大会开启AI全球化新对话:技术无国界,合作促创新
  • 虚拟主机都有哪些应用场景?
  • C++11新增重要标准(下)
  • OTF字体包瘦身,保留想要的字
  • 【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
  • excel中数字不满六位在左侧前面补0的方法
  • python打卡第45天
  • 【自然语言处理】大模型时代的数据标注(主动学习)
  • 如何评估大语言模型效果
  • 机器学习-经典分类模型
  • 微前端 - Module Federation使用完整示例
  • Spring Boot + Thymeleaf 防重复提交
  • 算法练习-回溯
  • CKA考试知识点分享(2)---ingress
  • 【推荐算法】推荐算法演进史:从协同过滤到深度强化学习