ESP32外部中断原理详解及代码示例

news2024/9/20 1:03:13

一、为什么要使用中断

ESP32是一个集成了Wi-Fi、蓝牙并支持低功耗的微控制器。它有许多GPIO(通用输入/输出)引脚,可以用于连接各种外部设备,如传感器、按钮、开关等。
在使用这些外部设备时,我们经常需要知道它们何时发生了变化,比如按钮是否按下,传感器是否检测到了某个信号。为了检测这些变化,ESP32提供了中断功能,当GPIO引脚状态发生改变时,ESP32可以立即暂停当前任务并开始处理中断程序。这样可以大大提高系统的实时性和响应速度。
外部中断的处理需要一定的硬件和软件支持,因此只有特定的GPIO引脚才能用于外部中断。ESP32的所有GPIO引脚(除了34-39之外)都可以被配置为中断引脚,其中一些引脚还具有额外的功能,如触摸感应和内部上拉电阻。

使用外部中断有以下几个好处:

1. 实时响应:外部中断可以立即暂停当前任务并执行中断程序,因此可以实现对外部事件的实时响应。比如,当按下按钮时,可以立即触发中断处理程序,而不需要在主循环中轮询按钮状态。

2. 节省CPU资源:外部中断的处理由硬件负责,不需要CPU持续监测输入状态。这样可以节省CPU的资源,使得CPU可以处理其他任务,提供更好的系统性能。

3. 减少功耗:通过使用外部中断来检测外部事件,可以让系统进入低功耗状态,只有当中断事件发生时才唤醒系统处理。这在对功耗要求较高的应用中尤为重要,可以延长电池寿命或降低能耗。

4. 精准触发:外部中断可以通过配置边沿触发方式(上升沿、下降沿或双边沿)以及滤波选项,实现对特定事件的精确触发。这对于需要高精度的事件检测和计时非常有用,如测量脉冲宽度或计数器应用。

5. 提高系统可靠性:使用外部中断可以减少出错的可能性。由于中断是硬件级别的,不容易受到软件逻辑控制的干扰,因此可以提高系统的可靠性和稳定性。

总之,使用外部中断可以实现实时响应、节省CPU资源、降低功耗,并且具有精准触发和提高系统可靠性的优势。在需要对外部事件进行快速和可靠处理的应用中,使用外部中断是一个非常有效的方法。

二、中断原理

在单片机中,中断是指当 CPU 在正常处理主程序时,突然发生了另一件事件 A(中断发生)需要 CPU 去处理,这时 CPU 就会暂停处理主程序(中断响应),转而去处理事件 A(中断服务)。当事件 A 处理完以后,再回到主程序原来中断的地方继续执行主程序(中断返回)。这一整个过程称为中断。

 三、中断分类

 中断可以根据中断源分为 硬件中断 和 软件中断

  1. 硬件中断:也被称为外部中断,硬件中断响应外部硬件事件而发生。例如,当检测到触摸时会发生触摸中断,而当 GPIO 引脚的状态发生变化时会发生 GPIO 中断。GPIO 中断和触摸中断属于这一类;
  2. 软件中断:当触发软件事件(例如定时器溢出)时,会发生这种类型的中断。定时器中断是软件中断的一个例子。

注意:ESP32 无法使用 MicroPython 设置中断的优先级。 

ESP32 的外部中断有上升沿、下降沿、低电平、高电平触发模式。上升沿和下降沿触发如下:

 四、实例

通过外部中断实现按键控制 LED。

 

from machine import Pin

button = Pin(14, Pin.IN, Pin.PULL_DOWN)

# 配置中断模式
button.irq(handler, trigger)

外部中断通过 Pin 模块来配置。

其中 button.irq(handler, trigger) 是配置中断模式,参数意义:

  • handler: 中断执行的回调函数;
  • trigger: 触发中断的方式,共 4 种,分别是 Pin.IRQ_FALLING(下降沿触发)、Pin.IRQ_RISING(上升沿触发)、Pin.IRQ_LOW_LEVEL(低电平触发)、Pin.IRQ_HIGH_LEVEL(高电平触发)。

完整代码

 实例1:

import time
from machine import Pin

button = Pin(14, Pin.IN, Pin.PULL_DOWN)

led = Pin(2, Pin.OUT)

# 定义 button 的外部中断函数
def button_irq(button):
    time.sleep_ms(80)
    if button.value() == 1:
        led.value(not led.value())

button.irq(button_irq, Pin.IRQ_RISING)

实例2:

'''
该程序作用是使用外部中断控制按键输入
在线文档:https://docs.geeksman.com/esp32/MicroPython/15.esp32-micropython-interrupt.html
'''
import time
from machine import Pin


# 定义 PIN 引脚对象
button = Pin(14, Pin.IN, Pin.PULL_DOWN)
led = Pin(2, Pin.OUT)


# 定义外部中断函数
def button_irq(button):
    # 按键消抖
    time.sleep_ms(10)
    if button.value() == 1:
        led.value(not led.value())
        
        
# 绑定中断函数
button.irq(button_irq, Pin.IRQ_RISING)

实例3(Arduino)

/*
  该程序的作用是实现在串口屏中显示中断触发信息
  在线文档:https://docs.geeksman.com/esp32/Arduino/15.esp32-arduino-interrupt.html
*/

#define BUTTON 14


// 定义可以在外部中断函数内部使用的变量
volatile bool flag = false;

void handle_interrupt() {
  flag = true;
}


void setup() {
  Serial.begin(9600);
  pinMode(BUTTON, INPUT_PULLDOWN);

  // 配置中断引脚
  attachInterrupt(digitalPinToInterrupt(BUTTON), handle_interrupt, FALLING);
}


void loop() {
  if (flag) {
    Serial.println("外部中断触发了");
    flag = false;
    }
  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器数据恢复-RAID5常见故障的数据恢复方案

raid5阵列常见故障: 1、服务器硬件故障或者RAID阵列卡故障; 2、服务器意外断电导致的磁盘阵列故障; 3、服务器RAID阵列阵列磁盘出现物理故障,如:电路板坏、磁头损坏、盘面划伤、坏扇区、固件坏等; 4、误操作…

第二证券:10家央企集体行动!9月至今逾百家公司回购增持

10月16日,10家央企连续公告,掀起了新一轮回购增持潮。其间,5家上市公司发布新增增持方案,约5亿~16.3亿元;2家上市公司发布增持打开,估计约23.43亿元;1家上市公司新增回购方案&#x…

3dmax中的 (Corona 9)cr渲染器怎么渲染?cr渲染器使用教程

Corona 9渲染器在3ds Max和Cinema 4D中应用广泛,是一款高效且功能强大的渲染器,得到了许多用户的好评。 Corona 9有以下几个主要的特点: 出色的渲染速度:Corona 9被证明是一个快速且高效的渲染引擎,它能够在保证高质…

ps制作透明公章 公章变透明 ps自动化批量抠图制作透明公章

ps制作透明公章 公章变透明 1、抠图制作透明公章2、ps自动化批量抠图制作透明公章 1、抠图制作透明公章 2、ps自动化批量抠图制作透明公章 点击窗口-动作 命名完成后 点击记录 点击记录后 动作处于录制状态 我们下面把需要的图片处理操作在ps界面点击一遍即可 就会被动作自动…

16 个 Linux 最佳 Markdown 编辑器(2)

对于初学者来说,Markdown 是一个用 Perl 编写的简单且轻量级的工具,它使用户能够编写纯文本格式并将其转换为有效的 HTML(或 XHTML)。它是一种易于阅读、易于编写的纯文本语言,也是一种用于文本到 HTML 转换的软件工具…

诚迈科技董事长王继平出席中国(太原)人工智能大会并发表演讲

10月14日—15日,2023中国(太原)人工智能大会在山西省太原市举办。诚迈科技在大会上全面展示了其在人工智能领域的一系列创新技术与解决方案,诚迈科技董事长、统信软件董事长王继平受邀出席产业数字化转型论坛并发表主题演讲&#…

传输机房的基本结构

文章目录 传输机房主要结构 传输机房主要结构 ODF (Optical Distribution Frame),光纤配线架,是专为光纤通信机房设计的光纤配线设备,具有光缆固定和保护功能、光缆终接功能、调线功能,完成从设备间纤缆连…

CISP与NISP网络安全证书中渗透测试都需要了解什么?

网络信息安全领域中的渗透测试专家是未来薪水增长潜力较好的岗位之一。那渗透测试都需要了解那些知识领域呢? 第一阶段(渗透测试初级):kali linux 安全配置和优化、安全测试基本工具、burpsuite、Burp 进行 Web 漏洞扫描与分析、…

如果后端返回了十万条数据要你插入到页面中,你会怎么处理?

当面临需要插入大量数据到页面的情况时,下面是一些建议的处理方法: 分页加载:考虑将数据分成多个页面,每次只加载当前页面所需的数据。这样可以减少一次性加载大量数据对页面性能的影响,并提供更好的用户体验。 虚拟滚…

TCP/IP(十七)实战抓包分析(一)ICMP

一 TCP实战抓包分析 网络排查案例 ① 抓包分析涉及的内容 关于: TCP理论知识和tcpdump命令的知识,前面已经铺垫过了,这里不再赘述下面罗列了TCP的重点知识 客户端工具: curl、wget、postman、telnet、浏览器、ncwget --bind-addressADDRESS 指定…

Devdept Eyeshot Fem 2024.1 Crack

Eyeshot 是.NET 的 CAD 控件。它原生支持Windows Forms和Windows Presentation Foundation。它附带四个不同的Visual Studio工具箱项目:用于 2D 和 3D 几何创建或编辑的设计、用于自动 2D 视图生成的 绘图、使用线性静态分析进行几何验证的模拟以及用于CNC刀具路径生…

c 语言基础:L1-041 寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。 输出格式: 在一行中输出第一…

户外LED大屏推广的精确受众分析-华媒舍

随着科技的不断发展和人们对广告推广方式的需求不断变化,户外LED大屏作为一种新兴的广告形式,吸引了越来越多企业的注意。要想提高广告推广效果,就需要进行精确受众分析,以确保广告准确地传达给目标受众。本文将介绍户外LED大屏推…

如何将IDEA控制台输出的路径折叠起来,只留到java.exe

参考资料: idea运行时显示一堆路径_idea打印sql出现省略号-CSDN博客 1.问题现象: 2.预期效果: 3.问题产生原因: 环境变量没配好,重新配好就行了。(注:我配了,没成功,重新新建了一个m…

figma拉伸画板,导致元素变形,一键搞定

先来看问题,第一张是原图,第二张是拉伸画板后出现的问题 老样子废话不多说,直接上解决办法! MAC按住Cmd进行拉伸,windows按住Ctrl进行拉伸即可!

找回共享盘里被误删文件的几种方法

在我们使用共享盘进行文件存储和共享的过程中,不可避免地会遇到误删文件的情况。而这些文件可能是我们努力工作的成果,或者是珍贵的回忆。因此,本文将介绍一些方法来帮助您找回共享盘中误删的文件。 图片来源于网络,如有侵权请告知…

通过商品ID查询京东商品详情数据,可以拿到商品标题,商品价格,商品库存,商品销量,商品sku数据等,京东API接口

要通过商品ID查询京东商品详情数据,可以按照以下步骤进行: 在京东开放平台注册开发者账号,并创建应用。在创建应用时,选择商品API权限。在您的应用中,找到获取商品详情数据的接口。京东开放平台提供了多个API接口来获…

(实操)生命周期配置

Hello大家好。 在本课时我们将了解如何使用S3的生命周期配置来管理我们的对象。 回到S3控制台,选择iloveawscn-saa这个存储桶,然后点击上面的“管理”。在这里,我们可以创建生命周期规则,我们点击“创建生命周期规则”。…

【137.只出现一次的数字Ⅱ】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int singleNumber(vector<int>& nums) {int bitset0;for(int i0;i<32;i){int sum0;for(auto num:nums){if((num>>i)&1){sum;}}sum%3;if(s…

UnitTesting 单元测试

1. 测试分为两种及详细介绍测试书籍: 1.1 Unit Test : 单元测试 - test the business logic in your app : 测试应用中的业务逻辑 1.2 UI Test : 界面测试 - test the UI of your app : 测试应用中的界面 1.3 测试书籍网址:《Testing Swift》 https://www.hackingwithswift.c…