ESP32 MicroPython外部引脚中断处理

本文旨在介绍如何在运行MicroPython的ESP32上使用外部引脚中断功能。
首先,我们将导入机器模块,使用它来配置外部中断。
import machine
接下来,我们将声明一个全局变量,在发生中断事件时,中断处理函数将使用该变量与主程序通信。为了不丢失中断事件,这个变量被设置为一个计数器。关于中断和主代码之间的通信为何使用计数器而不是flag标志的原因,请查看早先的教程。

注意,我们不能在中断服务程序中较长时间地执行任务(例如,将内容打印到串口控制台),所以我们在设计中断任务时应使其尽快地完成。为此,中断服务程序将通知主代码(通过递增计数器的值)发生了中断事件,然后由主代码对任务进行处理。
interruptCounter = 0
我们还将使用另一个变量来跟踪自程序开始执行以来发生了多少次中断事件。在每次发生中断事件时,我们都会递增这个变量的值并将其打印出来。
totalInterruptsCounter = 0
接下来,我们将定义发生中断时需要执行的回调函数。该函数有一个输入参数,当中断发生时,一个Pin类对象将会被传递给此参数。在这个esp32 micropython教程中,我们不会使用到这个函数。

在函数实际执行时,它将递增先前定义的interruptCounter变量的值。请注意,在函数内部更改此变量的值之前,我们首先要将此变量声明为全局变量。
def callback(pin):
  global interruptCounter
  interruptCounter = interruptCounter+1
接下来我们需要创建一个Pin类对象,用于在MicroPython中控制GPIO引脚[1]。您可以在此处查看构造函数的所有可用参数。在这个程序中,我们需要将待使用的引脚编号、引脚模式以及是否存在相关拉电阻等信息作为输入参数。

在此示例中,我使用的是引脚25,但你也可以使用其它引脚。请注意,对于某些ESP32开发板,ESP32 GPIO编号可能与板上标记的编号不匹配。

此外,我们还将利用Pin类对象的IN常量属性将引脚模式设置为输入模式。

最后,我们将引脚设置为使用上拉电阻,从而保证在没有施加电信号时该引脚将处于已知状态(高电平,VCC)。 此设置可通过将Pin类的PULL_UP常量传递给函数参数来完成。
p25 = machine.Pin(25, machine.Pin.IN, machine.Pin.PULL_UP)
接下来,我们将通过调用Pin对象的irq函数来指定如何触发中断以及需要执行的回调函数。

在此示例中,我们指定当检测到引脚输入信号下降沿时触发中断程序。为此,我们需要将Pin类对象的IRQ_FALLING常量作为irq函数的触发参数。您可以在此查看所有可用的触发类型。

我们还将把先前定义的中断函数以句柄参数的形式传递给处理函数。
p25.irq(trigger=machine.Pin.IRQ_FALLING, handler=callback)
至此,所有配置工作都已完成,我们将进入轮询循环以查询interruptCounter变量。当然,我们的程序非常简单,不需要执行其它任务,只要执行轮询任务即可。在实际应用中,我们很可能需要执行一些计算任务,或者让开发板进入睡眠模式以节省能量,而非不断地查询变量的值。

当检测到它的值大于0时,我们将处理此中断事件。首先,我们将递减计数器的值,以此表示即将处理此中断事件。

请注意,由于此变量也用于中断服务程序代码,所以我们需要首先禁用中断功能,然后递减计数器,再重新启用中断功能,从而避免竞态条件。

中断的禁用和重新启用是通过机器模块的disable_irq和enable_irq函数完成的。关于如何使用这些函数的详细信息,请查看先前的教程。

最后,我们将递增中断计数器的总计数值并将其打印出来。在此示例中,由于此变量不与中断服务程序共享,所以我们在更改其值时不需要禁用中断功能。

MicroPython脚本的最终源代码如下所示,其中包含了中断检查循环。
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))

测试代码

为了测试此代码,我们只需将上述脚本上传到ESP32并运行即可。在运行状态下,不需外部硬件就能触发中断的最简单方法是接通和断开中断输入引脚与开发板GND引脚的接线。

在执行此操作时请特别小心,避免因为将GND引脚连接到错误的GPIO而损坏开发板。

中断事件的处理结果如图1所示。

ESP32 MicroPython外部引脚中断处理
图1 - ESP32 MicroPython外部引脚中断

来源:https://mc.dfrobot.com.cn/thread-276544-1-1.html

- 本文内容来自网络,如有侵权,请联系本站处理。

2024-11   阅读(471)   评论(0)
 标签: 创客 ESP32 MicroPython

涨知识
LED点阵屏

LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。

评论:
相关文章
【ESP32 C++教程】Unit4-1 数字量传感器

本小节讲解Sensor类及派生类、数字量传感器使用和传感器的推荐交互流程。


【ESP32 C++教程】Unit3-2 触摸输入

本小节讲解ESP32内置触摸引脚的用法,


【ESP32 C++教程】Unit3-1 按键输入

本小节主要介绍按键信号转换、Button类及派生类、和Button交互推荐流程。


【ESP32 C++教程】Unit2-2 Ws2812灯珠

本小节主要介绍Ws2812灯珠的使用、对父类进行扩展实现自定义功能,和指针向下强制转换的使用。


【ESP32 C++教程】Unit2-1 RGB三色LED

本小节主要介绍RGB三色LED的使用,以及多态的具体实现。


【ESP32 C++教程】Unit1-3 ESP32 Arduino 开发框架

ESP32 Arduino Framework是专门针对ESP32开发板的Arduino应用开发框架,为用户开发IOT应用、HMI应用提供一致的开发体验。


ESPConnect:基于浏览器的ESP32管理器

ESPConnect是一个基于现代浏览器的管理器,在你需要快速验证、调试、管理文件、检查状态的时候,它能帮你省下大量打开和切换重型工具的时间。


用ESP32做一个FM收音机

本文介绍两种使用TEA5767收音机模块实现FM收音机的方案,感兴趣的朋友可在此基础上实现更丰富的功能。


GPIOViewer:让ESP32引脚状态一览无余!

GPIOViewer 是一个强大的 Arduino 库,专门为 ESP32 芯片设计,可以实时监控 ESP32 芯片上的所有 GPIO 引脚状态。它可以帮助你快速直观地了解每个引脚的当前状态,例如高电平、低电平、输入、输出、中断等等。


ESP32 I2S音频:初识I2S通信与配置基础

在音频处理领域,I2S是一种广泛使用的通信协议,它专门用于芯片之间的音频数据传输。ESP32 作为一款高性能的微控制器,不仅支持 I2S 通信,还提供了强大的硬件接口和灵活的软件库,使其成为音频项目开发的理想选择。