文章目錄
- 前言
- 硬件中斷
- 硬件中斷概念
- 硬件中斷的使用
- 軟件中斷
- 軟件中斷概念
- 軟件中斷的使用
- 總結
前言
ESP32是一款高度集成的芯片,具有強大的中斷處理能力。在ESP32中,我們可以配置所有的GPIO引腳作為硬件中斷源,通過附加它們到相應的中斷服務例程(ISR)來啟用中斷。此外,ESP32還支持軟件中斷,例如定時器溢出時的定時器中斷。
硬件中斷
硬件中斷概念
硬件中斷是響應外部硬件事件而發生的,例如,當檢測到觸摸時發生觸摸中斷,當GPIO引腳的狀態改變時發生GPIO中斷。我們可以使用attachInterrupt()
函數在引腳上設置中斷。
硬件中斷的使用
在ESP32中,我們可以使用硬件中斷來響應按鍵事件。以下是一個簡單的示例,說明了如何使用硬件中斷來檢測按鍵按下的事件。
const int buttonPin = 12; // GPIO pin where the button is connected
volatile bool has_interrupted = false;void IRAM_ATTR myInterruptFunction() {has_interrupted = true;
}void setup() {Serial.begin(115200);pinMode(buttonPin, INPUT_PULLUP); // Configure the pin as an input with internal pull-up resistorattachInterrupt(digitalPinToInterrupt(buttonPin), myInterruptFunction, RISING); // Configure the interrupt
}void loop() {if(has_interrupted) {Serial.println("Button pressed!");has_interrupted = false;}
}
-
attachInterrupt(digitalPinToInterrupt(buttonPin), myInterruptFunction, RISING);
- 函數原型:
void attachInterrupt(uint8_t pin, voidFuncPtr callback, int mode);
- 作用:將中斷服務例程(ISR)附加到指定的GPIO引腳上。
- 參數:
pin
:要附加中斷的GPIO引腳編號。callback
:中斷發生時調用的函數(ISR)。mode
:定義觸發中斷的條件,例如RISING、FALLING、CHANGE等,他們分別表示上升沿觸發,下降沿觸發和改變就觸發。
- 返回值:無。
- 函數原型:
-
digitalPinToInterrupt(buttonPin)
- 函數原型:
int digitalPinToInterrupt(int pin);
- 作用:將數字引腳轉換為中斷號,用于
attachInterrupt()
函數。 - 參數:
pin
:要轉換的數字引腳編號。
- 返回值:對應的中斷號。
- 函數原型:
-
myInterruptFunction()
- 函數原型:
void IRAM_ATTR myInterruptFunction();
- 作用:定義中斷服務例程(ISR),在中斷發生時執行的函數。
- 參數:無。
- 返回值:無。
IRAM_ATTR
是一個特殊的屬性,用于指示編譯器將特定的代碼段放置在ESP32的內部RAM(IRAM)中。這是因為ESP32基于哈佛架構,具有兩個總線:一個用于指令,一個用于數據。IRAM是可執行的,并且只能通過4字節對齊的字進行讀取或寫入。
- 函數原型:
當你在代碼中使用IRAM_ATTR
標記時,你正在聲明編譯后的代碼將被放置在名為".dram.text"的段中。這意味著可執行文件不僅有".text"和".data"段,還有其他段。在ESP32啟動時,引導程序會在將控制權交給你的應用程序之前,將".dram.text"段復制到實際的RAM中。然后,RAM被映射到指令區域地址空間(> 0x4000 0000),這意味著可以將控制權傳遞給此代碼(如常規操作),因為代碼位于指令總線地址空間中。
使用IRAM_ATTR
的一個主要原因是,當ESP32執行Flash操作(如寫入或擦除)時,需要在RAM中運行的中斷服務例程(ISR)。如果不使用IRAM_ATTR
,代碼將被放置在Flash中,而Flash在ESP32上的速度比內部RAM慢。
軟件中斷
軟件中斷概念
軟件中斷是當觸發軟件事件時發生的,例如定時器溢出。我們可以使用ESP32的定時器中斷來執行特定的任務。
軟件中斷的使用
在此之前我們寫過定時器的文章,我們這里就不多贅述:ESP TIMER
總結
ESP32的中斷處理能力非常強大,無論是硬件中斷還是軟件中斷,都可以幫助我們更有效地管理和控制硬件設備,提高系統的實時性和響應速度。通過理解和掌握ESP32的中斷機制,我們可以更好地利用這款芯片的強大功能,為我們的項目帶來更多可能性。