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

在使用外部设备时,我们经常需要知道它们何时发生了变化,比如按钮是否按下,传感器是否检测到了某个信号。可以通过中断来检测这些变化,立即暂停当前任务并开始处理中断程序,大大提高系统的实时性和响应速度。

一、为什么要使用中断

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 处理完以后,再回到主程序原来中断的地方继续执行主程序(中断返回)。这一整个过程称为中断。

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

三、中断分类

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

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

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

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

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

 四、实例

通过外部中断实现按键控制 LED。
ESP32外部中断原理详解及代码示例

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(MicroPython)

import time
from machine import Pin

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

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

# 绑定中断函数
button.irq(button_irq, Pin.IRQ_RISING)

实例2(Arduino)

/*
 *该程序的作用是实现在串口屏中显示中断触发信息
 */
#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;
    }
}
- 本文内容来自网络,如有侵权,请联系本站处理。

2024-07   阅读(239)   评论(0)
 标签: 创客电子 ESP32 MicroPython

涨知识
中断

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

评论:
相关文章
MimiClaw应用与开发教程1:部署和测试

MimiClaw‌ 是一款基于 ‌ESP32-S3‌ 芯片的超轻量级AI助手,适合嵌入式AI与物联网开发者快速部署本地化AI代理。本系列教程基于MimiClaw的Arduino移植版本进行讲解,小节主要讲解部署和测试。


ESP32扫描wifi 热点列表

就像我们用手机打开WiFi功能后可以浏览附近的可用WiFi。要将手机连接到热点,通常需要打开Wi-Fi设置应用程序,列出可用的网络,然后选择所需的热点。然后输入密码(或不输入密码),可以使用ESP32进行相同的操作。


MimiClaw 配置飞书机器人和添加硬件控制技能

本文本介绍配置飞书机器人为MimiClaw的一个输入/输出端,和添加一个控制WS2812与LED的控制技能。


ESP32-S3 部署 MimicLaw 完整教程:从零到成功调用 DeepSeek

一块 30 块钱的开发板 + 一个大模型 API,就能做出可以听懂人话的智能硬件。 本文记录完整安装过程和踩坑经验,确保你跟着做就能跑通。


MimiClaw 架构全解析,把 “智能龙虾” 跑在 ESP32 上

本文将从手绘架构图入手,逐层拆解 MimiClaw 的分层设计、核心模块、数据流转与底层实现,带你解剖这只“智能虾”的技术骨架,看懂在 C 语言加持下,AI 智能体如何以可穿戴设备的形态,在你身边稳稳运行、离线服务、主动响应。


如何用 platform.local.txt 深度定制 ESP32 编译流程?

本文介绍如何在不脱离 ArduinoIDE 可视化开发的前提下,通过一个名为 platform.local.txt 的小文件,实现对 ESP32 编译流程的精准控制。


优化Arduino-ESP32程序体积

本文将系统分析程序体积增长的五大根源,并提供经过验证的优化方案,帮助减小固件大小。


开发ESP32大模型AI语音助手-从软件到硬件

本文所DIY的语音助手设备端使用的是MicroPython、服务端是Python,对于很多开发者来说MicroPython入门没难度。


【ESP32 C++教程】Unit10-2:音频录制

本小节使用音频开发框架实现一个音频录制到文件的示例。


ESP32 I2S 接口深度解析:从时序、格式到 ESP-IDF 驱动实战

I2S协议通过BCLK、LRCLK和DATA三线精准传输音频数据,但时序边沿、帧格式、时钟源等细节常引发噪声或断连。本文详解ESP32的I2S实现,从协议原理到ESP-IDF v5.x代码配置,助你避开常见陷阱,确保音频稳定传输。