找回密码
 立即注册
首页 业界区 安全 《ESP32-S3使用指南—IDF版 V1.6》第十一章 KEY实验 ...

《ESP32-S3使用指南—IDF版 V1.6》第十一章 KEY实验

移国拱 2025-6-1 21:00:29
第十一章 KEY实验
1)实验平台:正点原子DNESP32S3开发板
2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6
3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子DNESP32S3开发板技术交流群:132780729
1.jpeg

2.png

在上一章,我们详细讲解了GPIO的输出模式,并演示了如何利用它来控制LED的亮灭。而在本章中,我们将重点关注GPIO的输入模式配置,学会如何获取外部的输入信号,例如检测按键的状态。通过学习本章内容,开发者将能够掌握GPIO作为输入模式的使用方法,进一步扩展其在嵌入式系统开发中的应用能力。
本章分为如下几个小节:
11.1独立按键基础知识
11.2硬件设计
11.3 程序设计
11.4 下载验证
11.1 独立按键基础知识
独立按键是一种简洁高效的输入设备,广泛应用于各类电子设备中,实现基础的用户交互功能。其工作原理主要基于机械开关的触发机制,当用户按下按键时,便能执行相应的操作。独立按键在尺寸、形状和颜色上都具有多样性,便于用户进行辨识和使用,满足不同场景下的需求。
1,独立按键原理
独立按键的原理主要依赖于机械触点和电气触点之间的相互作用。在未被按下时,触点保持分离状态,电路处于断开状态。然而,当用户按下按键时,在弹簧和导电片的共同作用下,触点会闭合,从而使电路连通。此时,微控制器能够检测到按键触发的信号,进而执行相应的操作。这种基于物理触点的设计使得独立按键既稳定又可靠,广泛应用于各种电子设备中。
2,消抖措施
机械按键在闭合与分开的过程中,由于机械振动(类似于弹簧效应)的存在,可能导致开关状态在短时间内频繁切换,这种现象被称为按键抖动。下图是独立按键抖动波形图。
3.png

图11.1.1 独立按键抖动波形图
图中的按下抖动和释放抖动的时间一般为5~10ms,如果在抖动阶段采样,其不稳定状态可能出现一次按键动作被认为是多次按下的情况。为了避免抖动可能带来的误操作,我们要做的措施就是给按键消抖(即采样稳定闭合阶段)。
为了消除这种抖动,我们通常采用软件消抖和硬件消抖两种主要方法:
(1)软件消抖:主要是通过编程的方法,设定一个延迟或计时器,确保在一定的时间内只读取一次按键状态,避免抖动对程序的影响。
(2)硬件消抖:在按键电路中加入元器件如电阻、电容组成的RC低通滤波器,对按键信号进行平滑处理,降低抖动的影响。
我们例程中使用最简单的延时消抖。检测到按键按下后,一般进行10ms延时,用于跳过抖动的时间段,如果消抖效果不好可以调整这个10ms延时,因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态,如果没有按下,那我们就判断这是抖动或者干扰造成的;如果还是按下,那么我们就认为这是按键真的按下了。对按键释放的判断同理。
11.2 硬件设计
11.2.1例程功能
实验现象:按下BOOT按键可控制LED状态翻转。
11.2.2硬件资源

  • LED
    LED-IO1
  • 按键
    BOOT-IO0
11.2.3原理图
本章实验使用的一个ESP32-S3开发板板载按键:BOOT按键,其于板载MCU的连接原理图,如下图所示:
4.png

图11.2.3.1按键与MCU的连接原理图
从上面的原理图中可以看出,BOOT按键的一端连接到了电源负极,而另一端分别与MCU的BOOT引脚相连接,因此当按键被按下时,MCU对应的引脚都能够读取到低电平的状态,而当松开按键后,MCU对应的引脚读取到的电平状态却是不确定的,因此用于读取BOOT按键的BOOT引脚不仅要配置为输入模式,还需要配置成上拉。
11.3 程序设计
11.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
5.png

图11.3.1.1 KEY实验程序流程图
11.3.2 GPIO函数解析
GPIO函数已在10.3.2章节中详细阐述,为避免重复,此处不再赘述。建议读者查阅第十章的函数解析章节,以获取更多关于GPIO函数的信息。
11.3.3 KEY驱动解析
在IDF版的02_key例程中,作者在01_key\components\BSP路径下新增了一个KEY文件夹,用于存放key.c和key.h这两个文件。其中,key.h文件负责声明KEY相关的函数和变量,而key.c文件则实现了KEY的驱动代码。下面,我们将详细解析这两个文件的实现内容。
1,key.h文件
  1. /* 引脚定义 */
  2. #define BOOT_GPIO_PIN   GPIO_NUM_0
  3. /*IO操作*/
  4. #define BOOT            gpio_get_level(BOOT_GPIO_PIN)
  5. /* 按键按下定义 */
  6. #define BOOT_PRES       1      /* BOOT按键按下 */
  7. /* 函数声明 */
  8. void key_init(void);            /* 初始化按键 */
  9. uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */
复制代码
此文件的核心内容已较为明确,无需过多阐述。它主要定义了BOOT宏,用于获取IO0的状态,并声明了key_init和key_scan函数,以便外部文件能够调用这些函数。通过这些声明和定义,该文件为其他部分的代码提供了必要的接口和功能支持。
2,key.c文件
此文件中定义了两个函数,分别为key_init和key_scan。接下来,我将对这两个函数进行详细的解析。
(1)key_init函数
[code]/***@brief       初始化按键*@param       无*@retval      无*/void key_init(void){   gpio_config_t gpio_init_struct;   gpio_init_struct.intr_type = GPIO_INTR_DISABLE;        /* 失能引脚中断 */   gpio_init_struct.mode = GPIO_MODE_INPUT;                /* 输入模式 */   gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;       /* 使能上拉 */   gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;  /* 失能下拉 */   gpio_init_struct.pin_bit_mask = 1ull
您需要登录后才可以回帖 登录 | 立即注册