ESP32 MicroPython教程:定時器中斷

導入machine模塊

import machine

聲明一個計數器

interruptCounter = 0

定時器中斷函數將使用這個計數器告知主代碼中斷已發生。之所以採取這種方式,主要是因爲中斷運行速度非常快,不應在中斷內進行函數調用(比如print)。
當中斷髮生時,中斷處理函數只是簡單地讓計數器遞增,我們在中斷函數外邊使用循環對計數器的數值進行檢查,並做出相應的操作。

再定義一個計數器

用於保存自程序開始運行以來所發生的所有中斷,以便將每一個新發生的中斷計數值打印出來。

totalInterruptsCounter = 0

新建一個Timer類的對象

該類的構造函數可接收一個數值參數(0到3),表示所要使用的定時器硬件(ESP32共有4種定時器硬件)。

timer = machine.Timer(0)

聲明handleInterrupt中斷處理函數

鑑於我們將對這個全局變量進行操作和修改,因此需要使用global關鍵字對其進行聲明,然後才能使用。

def handleInterrupt(timer):
  global interruptCounter
  interruptCounter = interruptCounter+1

初始化定時器

該函數的輸入參數包括中斷週期(單位爲毫秒)、定時器模式(一次性還是週期性)以及負責處理中斷的回調函數
本例將定時器設置爲週期性運行(每秒一次)。所以週期參數就是1000,定時器模式參數是Timer類的PERIODIC常量。對於一次性定時器,只需將模式參數改成Timer類的ONE_SHOT常量即可。
最後,在回調參數中,把先前聲明的中斷處理函數傳給它即可。

timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=handleInterrupt)

處理中斷

先通過調用machine模塊的disable_irq函數將中斷禁用。該函數會返回先前的IRQ狀態,我們把它保存在一個變量中。
重新使能中斷,只需調用machine模塊的enable_irq函數(將之前保存的IRQ狀態傳給它作爲輸入參數)即可。
在這兩次函數調用之間,對共享變量進行訪問和遞減操作。

state = machine.disable_irq()#中斷禁用
    interruptCounter = interruptCounter-1
    machine.enable_irq(state)#重新使能中斷
import machine#導入machine模塊
interruptCounter = 0#聲明一個計數器
totalInterruptsCounter = 0#再定義一個計數器,用於保存自程序開始運行以來所發生的所有中斷,以便將每一個新發生的中斷計數值打印出來。
timer = machine.Timer(0) #新建一個Timer類的對象,定時器硬件
def handleInterrupt(timer):# 聲明handleInterrupt中斷處理函數
  global interruptCounter#對這個全局變量進行操作和修改
  interruptCounter = interruptCounter+1
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=handleInterrupt)#初始化定時器,中斷週期,定時器模式,回調函數
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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章