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

     三、中断分类

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

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

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

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

     四、实例

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

     

    1. from machine import Pin
    2. button = Pin(14, Pin.IN, Pin.PULL_DOWN)
    3. # 配置中断模式
    4. 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:

    1. import time
    2. from machine import Pin
    3. button = Pin(14, Pin.IN, Pin.PULL_DOWN)
    4. led = Pin(2, Pin.OUT)
    5. # 定义 button 的外部中断函数
    6. def button_irq(button):
    7. time.sleep_ms(80)
    8. if button.value() == 1:
    9. led.value(not led.value())
    10. button.irq(button_irq, Pin.IRQ_RISING)

    实例2:

    1. '''
    2. 该程序作用是使用外部中断控制按键输入
    3. 在线文档:https://docs.geeksman.com/esp32/MicroPython/15.esp32-micropython-interrupt.html
    4. '''
    5. import time
    6. from machine import Pin
    7. # 定义 PIN 引脚对象
    8. button = Pin(14, Pin.IN, Pin.PULL_DOWN)
    9. led = Pin(2, Pin.OUT)
    10. # 定义外部中断函数
    11. def button_irq(button):
    12. # 按键消抖
    13. time.sleep_ms(10)
    14. if button.value() == 1:
    15. led.value(not led.value())
    16. # 绑定中断函数
    17. button.irq(button_irq, Pin.IRQ_RISING)

    实例3(Arduino)

    1. /*
    2. 该程序的作用是实现在串口屏中显示中断触发信息
    3. 在线文档:https://docs.geeksman.com/esp32/Arduino/15.esp32-arduino-interrupt.html
    4. */
    5. #define BUTTON 14
    6. // 定义可以在外部中断函数内部使用的变量
    7. volatile bool flag = false;
    8. void handle_interrupt() {
    9. flag = true;
    10. }
    11. void setup() {
    12. Serial.begin(9600);
    13. pinMode(BUTTON, INPUT_PULLDOWN);
    14. // 配置中断引脚
    15. attachInterrupt(digitalPinToInterrupt(BUTTON), handle_interrupt, FALLING);
    16. }
    17. void loop() {
    18. if (flag) {
    19. Serial.println("外部中断触发了");
    20. flag = false;
    21. }
    22. }

  • 相关阅读:
    数据库练习02
    为何学linux及用处
    自制了一个开发团队展示控制器来为成员引流【前端】
    用DIV+CSS技术设计的网页与实现制作【体育文化】dreamweaver学生网页设计
    html显示PDF并兼容IE浏览器的解决方案
    智慧学习环境移动智能终端零信任安全机制改进方案
    低代码选型应该注重哪些方面的能力?
    【微信小程序】实现投票功能(附源码)
    Greenplum数据库故障排查及修复
    Ubuntu websocket程序
  • 原文地址:https://blog.csdn.net/m0_73931287/article/details/133881068