【雕爷学编程】MicroPython手册之中断处理 IRQ函数

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述
MicroPython的IRQ是一个用于配置引脚中断处理函数的方法,它可以让用户在Python中编写响应引脚上的电平变化或边沿触发事件的回调函数。

IRQ方法的主要特点是:

它可以设置引脚的中断触发条件,如上升沿、下降沿、高电平、低电平等。
它可以设置引脚的中断优先级,用于在多个中断同时发生时决定哪个中断先处理。
它可以设置引脚的中断唤醒功能,用于在设备进入低功耗模式时唤醒设备。
它可以在回调函数中使用micropython.schedule方法来延迟执行一些复杂或耗时的操作,避免影响系统正常运行。

IRQ方法的应用场景是:

在MicroPython中实现与硬件设备的交互,如控制LED灯、电机、传感器等。
在MicroPython中实现基于硬件设备的应用,如物联网设备、远程控制、消息推送等。
在MicroPython中实现对系统性能和功耗的优化,如调整CPU频率、进入低功耗模式等。

IRQ方法需注意事项是:

使用IRQ方法时要注意硬件设备的规格和限制,避免造成电路板故障、锁定、崩溃或硬件损坏。
使用IRQ方法时要注意中断处理函数的编写,避免在中断上下文中执行过长或过复杂的代码,影响系统正常运行。
使用IRQ方法时要注意不同端口之间的差异和兼容性问题,避免在移植代码时出现错误或异常。

以下是MicroPython的IRQ几个实际运用程序案例:

案例一:使用IRQ方法配置一个中断处理函数,在按钮按下时打印消息。

import machine

# 创建一个Pin对象,连接到GPIO0引脚,并设置为输入模式,并启用内部上拉电阻
button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)

# 定义一个中断处理函数,打印引脚对象和事件类型
def irq_handler(pin, event):
    print(pin, event)

# 配置引脚的中断处理函数,触发条件为下降沿
button.irq(irq_handler, trigger=machine.Pin.IRQ_FALLING)

案例二:使用IRQ方法配置一个中断处理函数,在按钮按下时点亮LED灯,并使用micropython.schedule方法来熄灭LED灯。

import machine
import micropython

# 创建一个Pin对象,连接到GPIO2引脚,并设置为输出模式
led = machine.Pin(2, machine.Pin.OUT)
# 创建一个Pin对象,连接到GPIO0引脚,并设置为输入模式,并启用内部上拉电阻
button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)

# 定义一个延迟执行的函数,用于熄灭LED灯
def led_off():
    led.value(0)

# 定义一个中断处理函数,在按钮按下时点亮LED灯,并使用micropython.schedule方法来延迟执行led_off函数
def irq_handler(pin, event):
    led.value(1)
    micropython.schedule(led_off, 0)

# 配置引脚的中断处理函数,触发条件为下降沿
button.irq(irq_handler, trigger=machine.Pin.IRQ_FALLING)

案例三:使用IRQ方法配置一个中断处理函数,在按钮按下时唤醒设备,并打印消息。

import machine

# 创建一个Pin对象,连接到GPIO0引脚,并设置为输入模式,并启用内部上拉电阻
button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)

# 定义一个中断处理函数,打印引脚对象和事件类型
def irq_handler(pin, event):
    print(pin, event)

# 配置引脚的中断处理函数,触发条件为下降沿,并启用唤醒功能
button.irq(irq_handler, trigger=machine.Pin.IRQ_FALLING, wake=machine.DEEPSLEEP)

# 进入深度睡眠模式
machine.deepsleep()

案例四:按钮中断:

from machine import Pin
import time

# 定义按钮中断处理函数
def button_interrupt(pin):
    print("按钮被按下")

# 将按钮连接到GPIO引脚
button_pin = Pin(5, Pin.IN)

# 配置按钮中断
button_pin.irq(trigger=Pin.IRQ_FALLING, handler=button_interrupt)

# 循环等待按钮中断
while True:
    time.sleep(1)

在这个例子中,我们使用IRQ模块的irq()方法配置了按钮的中断。我们指定了中断触发条件(下降沿触发)和中断处理函数(button_interrupt)。当按钮被按下时,中断处理函数将被调用,并打印出相应的消息。通过在循环中调用time.sleep()函数,我们可以让程序一直等待按钮中断的发生。

案例五:定时器中断:

from machine import Timer

# 定义定时器中断处理函数
def timer_interrupt(timer):
    print("定时器中断触发")

# 创建定时器对象
timer = Timer(0)

# 配置定时器中断
timer.init(period=500, mode=Timer.PERIODIC, callback=timer_interrupt)

# 循环等待定时器中断
while True:
    pass

在这个例子中,我们使用IRQ模块的Timer类创建了一个定时器对象。我们指定了定时器的周期(500毫秒)、工作模式(周期性)和中断处理函数(timer_interrupt)。当定时器中断触发时,中断处理函数将被调用,并打印出相应的消息。通过在循环中使用pass语句,我们可以让程序一直等待定时器中断的发生。

案例六:外部传感器中断:

from machine import Pin

# 定义外部传感器中断处理函数
def sensor_interrupt(pin):
    print("外部传感器中断触发")

# 将传感器连接到GPIO引脚
sensor_pin = Pin(4, Pin.IN)

# 配置外部传感器中断
sensor_pin.irq(trigger=Pin.IRQ_RISING, handler=sensor_interrupt)

# 循环等待外部传感器中断
while True:
    pass

在这个例子中,我们使用IRQ模块的irq()方法配置了外部传感器的中断。我们指定了中断触发条件(上升沿触发)和中断处理函数(sensor_interrupt)。当外部传感器中断触发时,中断处理函数将被调用,并打印出相应的消息。通过在循环中使用pass语句,我们可以让程序一直等待外部传感器中断的发生。

案例七:按钮中断检测

import machine

def button_pressed(pin):
    print("Button pressed")

button_pin = machine.Pin(5, machine.Pin.IN)
button_pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_pressed)

在此示例中,我们将GPIO引脚5配置为输入模式,并使用irq()方法设置中断回调函数。当按钮连接到GPIO引脚5的引脚上并按下时,触发button_pressed函数。

案例八:定时器中断

import machine
import time

def timer_callback(timer):
    print("Timer expired")

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

while True:
    time.sleep(1)

在此示例中,我们使用machine.Timer类创建一个定时器对象,并使用init()方法初始化定时器。每隔1秒,定时器将触发timer_callback函数。

案例九:外部传感器中断

import machine

def sensor_triggered(pin):
    print("Sensor triggered")

sensor_pin = machine.Pin(4, machine.Pin.IN)
sensor_pin.irq(trigger=machine.Pin.IRQ_RISING, handler=sensor_triggered)

在此示例中,我们将GPIO引脚4配置为输入模式,并使用irq()方法设置中断回调函数。当外部传感器连接到GPIO引脚4的引脚上,并检测到上升沿时,触发sensor_triggered函数。

这些示例展示了使用MicroPython的IRQ功能的一些常见用法。请根据您的具体硬件和需求进行适当的调整。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值