中斷用于處理在程序正常執行期間不發生但在特定觸發發生時發生的事件。例如,如果我們編寫一個使 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 中斷示例相同。
評論