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