【雕爷学编程】MicroPython手册之 pyboard 的外部中断

在这里插入图片描述

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的pyboard是一种基于STM32F405RG微控制器的开发板,它可以运行MicroPython语言,实现各种有趣和有用的功能。它的主要特点有:

体积小巧,采用邮票孔设计,方便嵌入各种项目中。
内置了4个LED灯,1个开关,1个复位按钮,1个用户按钮,1个USB接口,1个SD卡插槽,1个RTC电池座等。
内置了三轴加速度计(MMA7660),可以检测板子的运动和倾斜。
支持完整的MicroPython语言功能,包括REPL交互模式,内置模块,文件系统操作等。
支持多种通信协议,如UART,SPI,I2C,CAN等。
支持多种外设和传感器的接入和控制,如LCD屏幕,音频放大器,温湿度传感器等。

在这里插入图片描述
MicroPython的pyboard外部中断是一种利用pyboard上的多个引脚来检测和响应外部事件的功能,它可以让用户通过简单的代码来实现引脚的中断触发,回调,优先级等效果,也可以通过REPL交互模式来实时地调试和修改代码。

它的主要特点有:

敏感性强,pyboard上的多个引脚可以检测到高电平,低电平,上升沿,下降沿或双边沿等不同的信号变化,并触发相应的中断。
灵活性高,pyboard上的多个引脚可以通过pyb模块中的ExtInt类来创建和操作外部中断对象,也可以通过pyb模块中的Pin类和PinAF类来配置和映射引脚功能。
功能丰富,pyboard上的多个引脚可以支持多种通信协议和外设接口,如UART,SPI,I2C,CAN等,也可以与其他开发板或电脑进行通信和数据交换。

pyboard的外部中断的应用场景有:

作为教学和学习的工具,可以让学生通过编写代码来控制pyboard上的引脚,学习基本的电子和编程知识。
作为创意和娱乐的工具,可以让用户通过连接各种传感器和模块到pyboard上的引脚,实现各种有趣的项目,如开关,回调,计数器等。
作为研发和测试的工具,可以让开发者通过编写代码来控制pyboard上的引脚,与其他设备进行数据传输和分析。

使用pyboard的外部中断时需要注意的事项有:

pyboard需要通过USB线连接到电脑上,并安装相应的驱动程序才能使用。
pyboard需要使用MicroPython专用的IDE或者编辑器来编写和下载代码到板子上。
pyboard需要注意电源管理和供电方式,避免过载或者短路造成损坏。
pyboard需要注意与外部设备或传感器的兼容性和连接方式,避免引脚冲突或者信号干扰。

以下是一些关于pyboard的外部中断的代码案例:

案例1:实现开关功能:

# 导入pyb模块
import pyb
# 创建一个LED对象
led = pyb.LED(1)
# 创建一个外部中断对象
extint = pyb.ExtInt('X1', pyb.ExtInt.IRQ_RISING_FALLING, pyb.Pin.PULL_DOWN, None)
# 定义一个回调函数
def toggle(line):
    # 切换LED灯的状态
    led.toggle()
# 设置外部中断对象的回调函数
extint.callback(toggle)

案例2:实现回调功能:

# 导入pyb模块
import pyb
# 创建一个定时器对象
timer = pyb.Timer(4, freq=1)
# 创建一个外部中断对象
extint = pyb.ExtInt('X1', pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_DOWN, None)
# 定义一个回调函数
def blink(t):
    # 遍历四个LED灯
    for i in range(1, 5):
        # 创建一个LED对象
        led = pyb.LED(i)
        # 点亮LED灯
        led.on()
        # 延时500毫秒
        pyb.delay(500)
        # 熄灭LED灯
        led.off()
# 设置外部中断对象的回调函数
extint.callback(blink)

案例3:实现计数器功能:

# 导入pyb模块
import pyb
# 创建一个LCD对象
lcd = pyb.LCD('X')
# 创建一个外部中断对象
extint = pyb.ExtInt('X1', pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_DOWN, None)
# 创建一个计数变量
count = 0
# 定义一个回调函数
def count_up(line):
    # 声明全局变量
    global count
    # 计数加一
    count += 1
    # 在LCD上显示计数值
    lcd.write('Count: {}'.format(count))
# 设置外部中断对象的回调函数
extint.callback(count_up)

案例4:监测按钮按下事件:

import pyb

button_pin = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_UP)  # 使用引脚X1作为输入,启用上拉电阻

def button_callback(line):
    print("Button pressed")

# 配置外部中断
extint = pyb.ExtInt(button_pin, pyb.ExtInt.IRQ_FALLING, pyb.Pin.PULL_NONE, button_callback)

while True:
    pass

这个程序使用 MicroPython 在 pyboard 上配置外部中断,当引脚 X1 上的按钮按下时,会触发外部中断,并执行回调函数 button_callback(),在终端打印按钮按下的信息。

案例5:计数器示例::

import pyb

counter = 0

def extint_callback(line):
    global counter
    counter += 1
    print("Counter:", counter)

# 配置外部中断
extint = pyb.ExtInt(pyb.Pin('X1'), pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, extint_callback)

while True:
    pass

这个程序使用 MicroPython 在 pyboard 上配置外部中断,当引脚 X1 上的输入信号由低电平变为高电平时,会触发外部中断,并执行回调函数 extint_callback()。每次触发中断时,计数器 counter 值加1,并在终端打印计数器的值。

案例六:使用多个外部中断:

import pyb

def extint1_callback(line):
    print("External Interrupt 1")

def extint2_callback(line):
    print("External Interrupt 2")

# 配置外部中断
extint1 = pyb.ExtInt(pyb.Pin('X1'), pyb.ExtInt.IRQ_FALLING, pyb.Pin.PULL_NONE, extint1_callback)
extint2 = pyb.ExtInt(pyb.Pin('X2'), pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, extint2_callback)

while True:
    pass

这个程序使用 MicroPython 在 pyboard 上配置多个外部中断。当引脚 X1 上的输入信号由高电平变为低电平时,会触发外部中断1,并执行回调函数 extint1_callback()。当引脚 X2 上的输入信号由低电平变为高电平时,会触发外部中断2,并执行回调函数 extint2_callback()。在回调函数中,分别打印相应的中断信息。这些代码示例展示了 MicroPython 在 pyboard 上配置和使用外部中断的实际应用。请注意,具体的引脚定义和中断触发条件可能会根据硬件配置进行调整。

案例7:按钮触发外部中断:

import pyb

button = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_UP)  # 初始化按钮引脚
led = pyb.LED(1)  # 初始化LED对象

def button_callback(line):
    led.toggle()  # 切换LED状态

button.irq(trigger=pyb.Pin.IRQ_FALLING, handler=button_callback)  # 配置外部中断

while True:
    pyb.delay(1000)

在上述示例中,我们使用pyb.Pin()初始化按钮引脚对象,并设置其为输入引脚,并启用上拉电阻。然后,我们通过pyb.LED()初始化一个LED对象用于指示状态。接下来,定义了一个名为button_callback()的回调函数,当按钮触发外部中断时,该函数将被调用,切换LED的状态。最后,通过button.irq()函数配置按钮引脚的外部中断,设置触发条件为下降沿触发,并指定回调函数。程序将持续运行,每次按钮触发外部中断时,LED状态将切换一次。

案例8:编码器输入触发外部中断::

import pyb

encoder_a = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_UP)  # 初始化编码器引脚A
encoder_b = pyb.Pin('X2', pyb.Pin.IN, pyb.Pin.PULL_UP)  # 初始化编码器引脚B
led = pyb.LED(1)  # 初始化LED对象

def encoder_callback(line):
    if encoder_b.value():  # 检测编码器引脚B状态
        led.on()  # 打开LED
    else:
        led.off()  # 关闭LED

encoder_a.irq(trigger=pyb.Pin.IRQ_RISING | pyb.Pin.IRQ_FALLING, handler=encoder_callback)  # 配置外部中断

while True:
    pyb.delay(1000)

在上述示例中,我们使用pyb.Pin()分别初始化编码器引脚A和B,并设置它们为输入引脚,并启用上拉电阻。然后,我们通过pyb.LED()初始化一个LED对象用于指示状态。接下来,定义了一个名为encoder_callback()的回调函数,当编码器输入触发外部中断时,该函数将被调用。在回调函数中,我们检测编码器引脚B的状态,如果为高电平,则打开LED;如果为低电平,则关闭LED。最后,通过encoder_a.irq()函数配置编码器引脚A的外部中断,设置触发条件为上升沿和下降沿同时触发,并指定回调函数。程序将持续运行,每次编码器输入触发外部中断时,LED状态将根据编码器引脚B的状态进行切换。

案例9:脉冲计数器触发外部中断::

import pyb

pulse = pyb.Pin('X1', pyb.Pin.IN)  # 初始化脉冲引脚
counter = 0  # 脉冲计数器

def pulse_callback(line):
    global counter
    counter += 1  # 每次触发外部中断时,计数器加1

pulse.irq(trigger=pyb.Pin.IRQ_RISING, handler=pulse_callback)  # 配置外部中断

while True:
    print("Pulse count:", counter)
    pyb.delay(1000)

在上述示例中,我们使用pyb.Pin()初始化脉冲引脚,并将其设置为输入引脚。然后,我们定义了一个名为pulse_callback()的回调函数,当脉冲输入触发外部中断时,该函数将被调用。在回调函数中,每次触发外部中断时,计数器counter加1。接下来,通过pulse.irq()函数配置脉冲引脚的外部中断,设置触发条件为上升沿触发,并指定回调函数。程序将持续运行,在每次循环中打印脉冲计数器的值,并延时1秒。这些示例提供了使用MicroPython在pyboard上进行外部中断的实际运用程序的参考代码。你可以根据具体的场景和需求进行修改和扩展。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值