【ESP32 IDF】key按键与EXTI中断
文章目录
- 前言
- 一、按键的使用
- 1.1 按键的简介
- 1.2 读取按键的高低电平
- 1.3 读取按键具体代码
- 二、中断
- 二、EXIT外部中断
- 2.1 EXIT外部中断简介
- 2.2 外部中断基础知识
- 2.3 设置外部中断
- 注册外部中断服务函数
- 设置触发方式
- 添加中断函数
- 2.4 示例代码
- 总结
前言
在嵌入式系统开发中,按键输入是与用户进行交互的重要方式之一。在 ESP32 开发中,我们可以利用外部中断(External Interrupt,简称 EXTI)来实现对按键的响应。外部中断使得我们可以在按键被按下时立即响应,而不需要轮询输入状态,这样可以提高系统的响应速度和效率。本文将介绍如何在 ESP32 IDF(Espressif IoT Development Framework)中实现按键输入与外部中断的结合,以实现对按键的快速响应和处理。
一、按键的使用
1.1 按键的简介
几乎每个开发板都会板载有独立按键,因为按键用处很多。常态下,独立按键是断开的,按下的时候才闭合。每个独立按键会单独占用一个 IO 口,通过 IO 口的高低电平判断按键的状态。但是按键在闭合和断开的时候,都存在抖动现象,即按键在闭合时不会马上就稳定的连接,断开时也不会马上断开。这是机械触点,无法避免。独立按键抖动波形图如下:
图中的按下抖动和释放抖动的时间一般为 5~10ms,如果在抖动阶段采样,其不稳定状态可能出现一次按键动作被认为是多次按下的情况。为了避免抖动可能带来的误操作,我们要做的措施就是给按键消抖(即采样稳定闭合阶段)。消抖方法分为硬件消抖和软件消抖,我们常用软件的方法消抖。
软件消抖:方法很多,我们例程中使用最简单的延时消抖。检测到按键按下后,一般进行10ms 延时,用于跳过抖动的时间段,如果消抖效果不好可以调整这个 10ms 延时,因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态,如果没有按下,那我们就判断这是抖动或者干扰造成的;如果还是按下,那么我们就认为这是按键真的按下了。对按键释放的判断同理。
硬件消抖:利用 RC 电路的电容充放电特性来对抖动产生的电压毛刺进行平滑出来,从而
实现消抖,但是成本会更高一点,本着能省则省的原则,我们推荐使用软件消抖即可。
1.2 读取按键的高低电平
我们可以使用下面这个函数来读取按键的高低电平:
int gpio_get_level(gpio_num_t gpio_num);
参数为按键的对应引脚标号
1.3 读取按键具体代码
在使用按键的使用,需要设置上拉或者下拉电阻,需要根据实际原理图进行选择,并且如果你需要读取按键的状态,你需要设置引脚方向为输入模式:
gpio_reset_pin(22);gpio_config_t key;
key.mode = GPIO_MODE_INPUT;
key.pull_up_en = GPIO_PULLUP_ENABLE;
key.pull_down_en = GPIO_PULLDOWN_DISABLE;
key.pin_bit_mask = (1ull << 22);
key.intr_type = GPIO_INTR_DISABLE;gpio_config(&key);void key_scan()
{// gpio_pad_select_gpio(22);if(gpio_get_level(22) == 0){vTaskDelay(10);if(gpio_get_level(22) == 0)printf("Key pressed\n");}
}
二、中断
二、EXIT外部中断
2.1 EXIT外部中断简介
外部中断(External Interrupt)是指来自于处理器外部的信号或事件,可以中断处理器当前的执行流程,跳转到相应的中断服务程序中执行。在嵌入式系统中,外部中断通常用于处理与外部设备或外部事件相关的响应操作,比如传感器的触发、按键的按下等。
当外部中断信号触发时,处理器会立即停止当前的任务,保存当前的执行环境(比如程序计数器、寄存器状态等),然后跳转到预先定义好的中断服务程序中执行相应的处理逻辑。一旦中断服务程序执行完成,处理器会恢复之前的执行状态,继续执行被中断的任务。
EXIT可能是指中断退出的意思,即当中断服务程序执行完成后,处理器退出中断状态,恢复到之前的执行流程中。
2.2 外部中断基础知识
在数字电路和信号处理中,上升沿和下降沿触发是指在信号的电压或电平变化时发生的事件。这些术语通常与时钟信号和触发器(比如触发器、寄存器等)的工作方式相关联。
上升沿触发:当信号的电压或电平从低电平(低电压)变为高电平(高电压)时,触发器或电路开始执行操作。简单来说,上升沿触发意味着在信号的上升沿(从低到高的过渡时刻)上触发动作。
下降沿触发:与上升沿相反,当信号的电压或电平从高电平(高电压)变为低电平(低电压)时,触发器或电路开始执行操作。换句话说,下降沿触发意味着在信号的下降沿(从高到低的过渡时刻)上触发动作。
这些概念在数字电路中非常重要,特别是在时序电路设计中。例如,在时钟边沿触发的触发器中,上升沿触发和下降沿触发可以决定何时执行数据的采样和传输
2.3 设置外部中断
注册外部中断服务函数
在 ESP32 IDF 中,gpio_install_isr_service
函数用于安装 GPIO 中断服务。通过安装 GPIO 中断服务,你可以注册 GPIO 中断处理程序,以便在 GPIO 引脚状态发生变化时得到通知并执行相应的操作。
以下是 gpio_install_isr_service
函数的使用方法:
#include "driver/gpio.h"void app_main() {// 初始化 GPIO 中断服务gpio_install_isr_service(0); // 参数 0 表示默认的 ESP_INTR_FLAG_DEFAULT// 在这里注册 GPIO 中断处理程序并进行其他操作
}
在使用 gpio_install_isr_service
函数时,你需要注意以下几点:
在调用 gpio_install_isr_service
函数之前,确保已经初始化了 GPIO 相关的硬件和驱动。
gpio_install_isr_service
函数接受一个参数,用于指定中断服务的配置选项。一般情况下,你可以传递 0 或者默认的 ESP_INTR_FLAG_DEFAULT
作为参数。
通常情况下,gpio_install_isr_service
函数只需要在应用程序的启动时调用一次,用于初始化 GPIO 中断服务。在后续的代码中,你可以注册具体的 GPIO 中断处理程序,并通过 gpio_isr_handler_add
函数将其与 GPIO 引脚关联起来。
通过使用 gpio_install_isr_service
函数,你可以在 ESP32 应用程序中方便地管理和处理 GPIO 中断,实现按键、传感器等外部事件的实时响应。
设置触发方式
在gpio_config_t
结构体中,有一个intr_type
成员,他用来设置gpio的中断触发方法的,他是一个枚举,他的定义如下:
typedef enum {GPIO_INTR_DISABLE = 0, /*!< Disable GPIO interrupt */GPIO_INTR_POSEDGE = 1, /*!< GPIO interrupt type : rising edge */GPIO_INTR_NEGEDGE = 2, /*!< GPIO interrupt type : falling edge */GPIO_INTR_ANYEDGE = 3, /*!< GPIO interrupt type : both rising and falling edge */GPIO_INTR_LOW_LEVEL = 4, /*!< GPIO interrupt type : input low level trigger */GPIO_INTR_HIGH_LEVEL = 5, /*!< GPIO interrupt type : input high level trigger */GPIO_INTR_MAX,
} gpio_int_type_t;
添加中断函数
我们可以使用下面这个函数来为某一个引脚添加中断回调函数:
esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void *args);
参数1为对应的引脚标号
参数2为回调函数,他的定义如下:
typedef void (*gpio_isr_t)(void *);
参数3为调用回调函数时,传入的参数是什么,如果没有,填NULL即可
2.4 示例代码
void LED()
{gpio_reset_pin(1);gpio_pad_select_gpio(1);gpio_set_direction(1,GPIO_MODE_OUTPUT);
}void IRAM_ATTR Key_ISR(void *p)
{static bool count = 0;count = !count;gpio_set_level(1,count);
}gpio_reset_pin(22);gpio_config_t key;
key.mode = GPIO_MODE_INPUT;
key.pull_up_en = GPIO_PULLUP_ENABLE;
key.pull_down_en = GPIO_PULLDOWN_DISABLE;
key.pin_bit_mask = (1ull << 22);
key.intr_type = GPIO_INTR_POSEDGE;gpio_config(&key);gpio_install_isr_service(0);LED();gpio_isr_handler_add(22,Key_ISR,NULL);
IRAM_ATTR: 这里的 IRAM_ATTR 属性用于将中断处理函数存储在内部 RAM 中,目的在于减少延迟
总结
通过本文的介绍,我们了解了在 ESP32 IDF 中如何利用外部中断(EXTI)来实现对按键输入的快速响应。首先,我们学习了如何配置 GPIO 并注册中断服务程序。然后,我们通过编写中断服务程序来处理按键的触发事件,并在其中进行相应的处理。通过这种方式,我们可以实现对按键的即时响应,提高系统的交互性和用户体验。在实际应用中,我们可以根据需求对按键的功能进行扩展和定制,从而实现更丰富和灵活的用户交互界面。
相关文章:

【ESP32 IDF】key按键与EXTI中断
文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平1.3 读取按键具体代码 二、中断二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断注册外部中断服务函数设置触发方式添加中断函数 2.4 示例代码 总结 前言 在嵌入式系统开发中&…...

Find My运动相机|苹果Find My技术与相机结合,智能防丢,全球定位
运动相机设计用于在各种运动和极限环境中使用,如徒步、登山、攀岩、骑行、滑翔、滑雪、游泳和潜水等,它们通常具有防抖防震、深度防水和高清画质的特点,能够适应颠簸剧烈的环境,甚至可以承受一定程度的摔落,一些运动相…...

零拷贝技术深入分析
一、零拷贝 在前面的文章“深浅拷贝、COW及零拷贝”中对零拷贝进行过分析,但没有举例子,也没有深入进行展开分析。本文将结合实际的例程对零拷贝进行更深入的分析和说明。 在传统的IO操作中,以文件通过网络传输为例 ,一般会经历以…...

Android 基础入门 基础简介
1. 观察App运行日志 2.Android 开发设计的编程语言 koltin Java c c 3.工程目录结构 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以这里不用写版本 }android {namespace "com.tiger.myap…...

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例
组网需求 如 图 2-15 所示,用户网络 1 通过 LSW1 与 Switch 相连, Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连, Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数,对 VLAN2 进…...
编程笔记 Golang基础 042 文件处理
编程笔记 Golang基础 042 文件处理 一、文件处理二、Go语言文件处理创建文件和写入内容打开文件并按模式读写读取文件内容更高级的文件和IO操作改变文件权限目录操作 小结 一、文件处理 文件处理是指在计算机科学中,对存储在磁盘或其他持久性存储介质上的文件进行的…...

linuxlsof详解
lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息,我们都知道,在Linux中,一切皆文件,lsof命令可以查看所有已经打开了的文件,比如: 普通文件,目录,特殊的块文件,…...
学习JAVA的第十二天(基础)
目录 算法 查找算法 基本查找(顺序查找) 二分查找(折半查找) 分块查找 排序算法 冒泡排序 选择排序 插入排序 快速排序 递归算法 算法 算法(Algorithm)是指解题方案的准确而完整的描述ÿ…...

Vector集合源码分析
Vector集合源码分析 文章目录 Vector集合源码分析一、字段分析二、方法分析三、总结 内容如有错误或者其他需要注意的知识点,欢迎指正或者探讨补充,共同进步。 一、字段分析 //用于存储该集合中的所有数据对象,所以是基于数组实现的 protec…...
Unity引擎中光源都有哪几种,都有什么作用
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com Unity 引擎为了实现游戏场景的明暗和光影效果,提供了四种类型的光源,分别是方向光(Directional Lights)、点光源(Point Lights)、聚光灯…...
C语言中结构体成员访问操作符的含义及其用法
1.直接访问操作符 用法:结构体名.成员名。 含义:直接访问结构体中的成员变量。 示例: #include<stdio.h> struct student {char name[20];int age; }; int main() {//定义了一个结构体数组arrstruct student arr[4] { {"cxk&q…...
Kubeadmin方式部署Calico网络模式的K8s集群
目录 1.环境准备 2.配置内核参数 3.配置ntp时间服务器 4.配置持久化日志目录 5.升级物理机内核 6.配置ipvs服务 7.安装docker 8.安装kubeadm、kubectl、kubelet 9.导入k8s组件基础镜像 10.k8s初始化配置 11.配置calico网络 12.完成部署 1.环境准备 ###方案中涉及的…...

sparse transformer 常见稀疏注意力
参考: https://zhuanlan.zhihu.com/p/259591644 主要就是降低transformer自注意力模块的复杂度 复杂度主要就是 Q K^T影响的,稀疏注意力就是在Q点乘K的转置这模块做文章 下列式一些sparse transformer稀疏注意力方法 a、transformer原始的 ࿰…...

力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学
前言 整体评价 T4感觉有简单的方法,无奈树形DP一条路上走到黑了,这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…...

基于springboot+vue的人格障碍诊断系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

Go-知识struct
Go-知识struct 1. struct 的定义1.1 定义字段1.2 定义方法 2. struct的复用3. 方法受体4. 字段标签4.1 Tag是Struct的一部分4.2 Tag 的约定4.3 Tag 的获取 githupio地址:https://a18792721831.github.io/ 1. struct 的定义 Go 语言的struct与Java中的class类似&am…...

SpringMVC 学习(十一)之数据校验
目录 1 数据校验介绍 2 普通校验 3 分组校验 4 参考文档 1 数据校验介绍 在实际的项目中,一般会有两种校验数据的方式:客户端校验和服务端校验 客户端校验:这种校验一般是在前端页面使用 JS 代码进行校验,主要是验证输入数据…...

软考55-上午题-【数据库】-数据库设计步骤1
一、数据库设计的步骤 新奥尔良法,四个主要阶段: 1、用户需求分析:手机用户需求,确定系统边界; 2、概念设计(概念结构设计):是抽象概念模型,较理想的是采用E-R方法。 …...
速盾:使用cdn后速度慢是怎么回事?
CDN(内容分发网络)是一种通过将网站的静态内容分布到全球各地的服务器,从而提供更快速度和更好用户体验的技术。然而,有时候用户会遇到使用CDN后速度变慢的问题,下面将探讨几种可能的原因。 服务器选择错误: CDN服务通…...

考研复试类比社团招新,无所谓“公平”,导师选谁都是他的权力
这篇文章是抖音和b站上上传的同名视频的原文稿件,感兴趣的csdn用户可以关注我的抖音和b站账号(GeekPower极客力量)。同时这篇文章也为视频观众提供方便,可以更加冷静地分析和思考。文章同时在知乎发表。 我考研一战的时候计算机考…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...