導入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))