我們學習了如何使用 Micropython 和 ESP32 實現 GPIO 輸入輸出功能。然而,這種方式存在一個問題:代碼需要不斷地檢測 IO 輸入口的變化,導致效率較低。特別是在一些特定場景下,例如某個按鍵可能一天只被按下一次,但我們仍然浪費了大量時間實時檢測按鍵情況。
為了解決這個問題,我們引入了外部中斷的概念。顧名思義,當按鍵被按下(產生中斷)時,我們才去執行相關功能。這大大節省了 CPU 的資源,因此中斷在實際項目中的應用非常普遍。
在這個實驗證中,我們利用中斷方式來檢查按鍵 KEY 狀態,被按鍵被按下(產生外部中斷)后使 LED的亮滅狀態翻轉。
什么是外部中斷
外部中斷是一種硬件機制,用于通知 CPU 有事件發生。當某個特定的條件滿足時(例如,一個按鍵被按下),CPU 會暫停當前的任務,轉而執行與該事件相關的處理程序。這樣,我們可以在事件發生時才去處理,而不是持續地檢測事件是否發生。
材料準備
連接電路
數字電路中的高低電平
在數字電路中,信號的傳輸是通過電壓的變化來實現的。上升沿、下降沿和高低電平是描述信號變化過程的重要概念。
1.高電平和低電平:
高電平和低電平是用來表示數字信號的兩個狀態。通常情況下,我們將邏輯“1”對應的電壓值稱為高電平(如3.3V或5V),將邏輯“0”對應的電壓值稱為低電平(如0V)。這兩個狀態之間的電壓差稱為閾值電壓。
2.上升沿:
上升沿是指信號從低電平跳變到高電平的過程。在這個過程中,信號的電壓從一個閾值電壓上升到另一個閾值電壓。上升沿通常用于表示一個事件的發生,例如按鍵按下、時鐘信號的上升等。
3.下降沿:
下降沿是指信號從高電平跳變到低電平的過程。在這個過程中,信號的電壓從一個閾值電壓下降到另一個閾值電壓。下降沿通常用于表示一個事件的結束,例如按鍵釋放、時鐘信號的下降等。
編寫代碼
代碼簡說
外部中斷也是通過 machine 模塊的 Pin 子模塊來配置,我們來看看其配構造函數和使用方法:
構造函數
KEY=machine.Pin(id,mode,pull) 構建按鍵對象
- id:引腳編號
- mode:輸入輸出方式
- pull:上下拉電阻配置
中斷使用方法
KEY.irq(handler,trigger) 配置中斷模式
handler:中斷執行的回調函數;
trigger: 觸發中斷的方式,共 4 種分別是
- Pin.IRQ_FALLING(下降沿觸發)
- Pin.IRQ_RISING(上升沿觸發)
- Pin.IRQ_LOW_LEVEL(低電平觸發)
- Pin.IRQ_HIGH_LEVEL(高電平觸發)
上升沿和下降沿觸發統稱邊沿觸發,根據前面的波形圖,我們可以選擇下降沿方式觸發外部中斷,也就是當按鍵被按下的時候立即產生中斷。
整體思路中斷跟前面的實驗類似,在初始化中斷后,當系統檢測到外部終端時候,執行 LED 亮滅狀態反轉的代碼即可。
在以上代碼中,需要注意以下幾點:
1.在函數fun
中使用全局變量state
時,需要使用global state
聲明,否則會在函數內部創建一個新的同名變量,導致沖突。
2.在定義回調函數fun
時,需要將Pin
對象KEY
作為參數傳遞進去。這樣可以確保在回調函數內部可以訪問到正確的引腳對象。
運行程序
運行代碼,每次按下按鍵 LED 狀態翻轉。
總結
從參考代碼來看,僅僅幾行代碼就實現了實驗功能,而且相對于使用while True
實時檢測函數來說,代碼的效率得到了極大的提升。外部中斷的應用非常廣泛,不僅包括普通的按鍵輸入和電平檢測,還有很多輸入設備,如傳感器,也是通過外部中斷方式來實時檢測的。這些在后面的章節中會詳細講解。
現在越來越注重青少年的科創活動,micropython,樹莓派,arduino,圖形化編程學會了硬件控制的基礎,這些平臺用起來大同小異。
-
led燈
+關注
關注
22文章
1595瀏覽量
109448 -
外部中斷
+關注
關注
1文章
133瀏覽量
16130 -
歐姆電阻
+關注
關注
0文章
71瀏覽量
15740 -
閾值電壓
+關注
關注
0文章
97瀏覽量
51850 -
ESP32
+關注
關注
21文章
1012瀏覽量
18984
發布評論請先 登錄
Linux下如何使用中斷的方式來驅動按鍵
按鍵KEY1作為外部中斷,分別測試上升沿和下降沿,發現觸發方式和程序設置的方式對不上是為什么?
基于STM32的按鍵控制與外部中斷實例詳解
基于STM32的按鍵控制與外部中斷實例詳解
通過按鍵的外部中斷來改變對應LED的狀態
STM32按鍵掃描/按鍵中斷/外部中斷資料下載

MSP432(Keil5)——2.按鍵及外部中斷驅動

STM32 HAL庫 CubeMX教程(四)按鍵外部中斷

評論