ESP32 MicroPython教程:外部中斷

導入模塊

導入機器模塊,使用它來配置外部中斷。

import machine

聲明全局變量

與主程序通信

聲明一個全局變量,在發生中斷事件時,中斷處理函數將使用該變量與主程序通信。爲了不丟失中斷事件,這個變量被設置爲一個計數器

注意,不能在中斷服務程序中較長時間地執行任務(例如,將內容打印到串口控制檯),所以我們在設計中斷任務時應使其儘快地完成。爲此,中斷服務程序將通知主代碼(通過遞增計數器的值)發生了中斷事件,然後由主代碼對任務進行處理。

interruptCounter = 0

計算中斷事件次數

用另一個變量來跟蹤自程序開始執行以來發生了多少次中斷事件。在每次發生中斷事件時,我們都會遞增這個變量的值並將其打印出來。

totalInterruptsCounter = 0

定義回調函數

def callback(pin):
  global interruptCounter
  interruptCounter = interruptCounter+1

創建一個Pin類對象

引腳編號引腳模式以及是否存在相關拉電阻等信息作爲輸入參數。

對於某些ESP32開發板,ESP32 GPIO編號可能與板上標記的編號不匹配。

此外,我們還將利用Pin類對象的IN常量屬性將引腳模式設置爲輸入模式。

最後,我們將引腳設置爲使用上拉電阻,從而保證在沒有施加電信號時該引腳將處於已知狀態(高電平,VCC)。 此設置可通過將Pin類的PULL_UP常量傳遞給函數參數來完成。

p25 = machine.Pin(25, machine.Pin.IN, machine.Pin.PULL_UP)

irq函數

指定如何觸發中斷以及需要執行的回調函數

在此示例中,我們指定當檢測到引腳輸入信號下降沿時觸發中斷程序。爲此,我們需要將Pin類對象的IRQ_FALLING常量作爲irq函數的觸發參數。觸發類型可查。
我們還將把先前定義的中斷函數以句柄參數的形式傳遞給處理函數。

p25.irq(trigger=machine.Pin.IRQ_FALLING, handler=callback)

當檢測到它的值大於0時,我們將處理此中斷事件
首先,我們將遞減計數器的值,以此表示即將處理此中斷事件。

注意,由於此變量也用於中斷服務程序代碼,所以我們需要首先禁用中斷功能disable_irq,然後遞減計數器,再重新啓用中斷功能enable_irq函數,從而避免競態條件。

while True:
  if interruptCounter>0:
    state = machine.disable_irq()
    interruptCounter = interruptCounter-1
    machine.enable_irq(state)
    totalInterruptsCounter = totalInterruptsCounter+1

遞增中斷計數器的總計數值並將其打印出來。
在此示例中,由於此變量不與中斷服務程序共享,所以我們在更改其值時不需要禁用中斷功能。

import machine
interruptCounter = 0#與主程序通信
totalInterruptsCounter = 0#計算中斷事件次數
def callback(pin):#定義回調函數
  global interruptCounter#聲明爲全局變量
  interruptCounter = interruptCounter+1
p25 = machine.Pin(25, machine.Pin.IN, machine.Pin.PULL_UP)#引腳編號、引腳模式下降沿以及是否存在相關拉電阻
p25.irq(trigger=machine.Pin.IRQ_FALLING, handler=callback)#觸發中斷,回調模式
while True:
  if interruptCounter>0:
    state = machine.disable_irq()#禁用計數器
    interruptCounter = interruptCounter-1
    machine.enable_irq(state)#重新啓動計數器
    totalInterruptsCounter = totalInterruptsCounter+1
    print("Interrupt has occurred: " + str(totalInterruptsCounter))

在運行狀態下,不需外部硬件就能觸發中斷的最簡單方法是接通和斷開中斷輸入引腳與開發板GND引腳的接線。確保不要錯誤連接,破壞開發板。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章