中断用于处理在程序正常执行期间不发生但在特定触发发生时发生的事件。例如,如果我们编写一个使 LED 闪烁的程序,微控制器将一个一个地执行每个命令。但是如果我们想监控一个开关来开始或停止闪烁,只有在所有其他任务完成之后才能完成检查,即它不会是实时的。这就是中断发挥作用的地方。有了中断,我们就不需要不断地检查数字输入引脚的状态。当发生中断时,控制器停止执行主程序,并调用称为 ISR 或中断服务程序的函数。然后控制器执行 ISR 内部的任务,然后在 ISR 执行完成后返回主程序。
ESP32 的每个内核共有 32 个中断。每个中断都有一定的优先级,大多数(但不是全部)中断都连接到中断多路复用器。因为中断源比中断多,所以有些中断是与多个中断源共享的。
ESP32中的中断类型
ESP32 中中断的主要分类是基于中断源。它们是硬件中断和软件中断。
外部或硬件中断
硬件中断响应外部硬件事件而发生。例如,当检测到触摸时会发生触摸中断,而当 GPIO 引脚的状态发生变化时会发生 GPIO 中断。GPIO 中断和触摸中断属于这一类。
软件中断
当触发软件事件(例如定时器溢出)时,会发生这种类型的中断。定时器中断是软件中断的一个例子。我们将在即将发布的 ESP32 定时器专用教程中讨论有关定时器的更多信息。
ESP32 GPIO 中断
使用 ESP32,我们可以将所有 GPIO 引脚配置为硬件中断源。我们可以通过将这些 GPIO 引脚连接到相应的 ISR 来启用中断。要附加中断,我们将使用attchInterrupt() 宏。attachInterrupt() 宏的用法如下-
附加中断(GPIOpin,ISR,事件);
attachInterrupt() 函数接受三个参数:
GPIOpin:此参数指示要附加中断的 GPIO 引脚号。
ISR:第二个参数是每次触发中断时会调用的函数名。
事件:第三个参数表示应该在哪个事件触发中断。五个可能的事件如下。
LOW:当引脚为低电平时触发中断
HIGH:当引脚为高电平时触发中断
CHANGE:每当引脚改变值时触发中断,从 HIGH 到 LOW 或 LOW 到 HIGH
FALLING:当引脚从 HIGH 变为 LOW 时触发中断
RISING:当引脚从 LOW 变为 HIGH 时触发中断
因此,例如,要在 GPIO4 的状态发生变化时触发中断,我们可以使用attachInterrupt函数,如下所示:
附加中断(4,ISR,改变);
如何禁用中断?
在某些情况下,我们将不得不暂时禁用中断。对于这种情况,我们可以使用detachInterrupt函数。一旦为特定引脚调用此函数,附加到该引脚的中断将被禁用,直到再次调用 attachInterrupt 函数或系统重新启动。使用它的语法如下 -
分离中断(GPIOPin);
中断服务程序或 ISR
这将是触发特定中断时调用的函数。语法如下:
void IRAM_ATTR ISR() {
语句;
}
其中ISR是函数名,语句是调用这个函数时应该完成的任务。由于 ISR 正在阻塞主程序,因此建议使用它来执行尽可能小的任务。参数IRAM_ATTR将确保 ISR 功能放置在 IRAM 区域而不是闪存区域。这将确保 ISR 函数加载速度更快。
硬件示例——打开或关闭 LED
在此示例中,我们将使用按钮开关打开和关闭 LED。但我们将使用 GPIO 中断,而不是使用轮询。为此,请在面包板上进行连接,如下图所示。
这是根据电路图连接在面包板上的实际电路。
#define pushButton_pin 33
#define LED_pin 32
void IRAM_ATTR toggleLED()
{
digitalWrite(LED_pin, !digitalRead(LED_pin));
}
void setup()
{
pinMode(LED_pin, OUTPUT);
pinMode(pushButton_pin,INPUT_PULLUP);
attachInterrupt(pushButton_pin,toggleLED,RISING);
}
无效循环()
{
}
只要按下按钮,GPIO33 的电压就会下降到 0V。当松开按钮时,电压会上升到 VCC。当电压上升时,将触发中断并调用相应的 ISR toggleLED。因为 ISR 只会在上升沿触发,所以去抖会被消除。
ESP32 触摸中断
就像 GPIO 中断一样,ESP32 在其 10 个触摸输入上支持触摸中断。使用触摸中断也类似。要附加触摸中断,我们将使用touchAttachInterrupt函数。它的语法如下:
touchAttachInterrupt(GPIOPin,ISR,阈值)
这里的GPIOPin是支持触摸输入的引脚,ISR 是 ISR 功能,Threshold 是应该触发中断的触摸值。其他一切都与 GPIO 中断示例相同。
评论
查看更多