Python 玩转物联网之 Micropython GPIO IRQ 处理

在做硬件编程的时候我们经常需要用IRQ来处理硬件的中断请求,比如键盘被按下的时候就会触发一个键盘中断,MCU在收到中断请求之后就需要作出相应的处理。本示例将用GPIO16模拟中断源,GPIO0和GPIO16连接,GPIO0作为中断输入引脚,中断通过GPIO0触发。运行的效果如下:

987879b2862b5b7ba6205e8e38824f88.jpeg

首先我们导入machine,utime这些系统库

micropython.alloc_emergency_exception_buf(100)

分配中断异常处理的堆栈,因为中断和正常运行的情况使用的是不同的堆栈,所以需要单独分配,另外在中断处理函数中尽量少开辟变量以免出现内存不足的情况,另外中断处理需要尽量快,所以最好不要用print之类的语句,请参考:
https://docs.micropython.org/en/latest/esp8266/reference/isr_rules.html?highlight=interrupt

然后定义一个回调函数作为中断处理函数(ISR):

count = 0
lev = 1
ms = 0
speed = 0
def callback(p):
    global count
    global d0
    global lev
    global ms
    global speed
    count = count+1
    if lev == 1:
        ms = utime.ticks_us()
        d0.irq(trigger=machine.Pin.IRQ_FALLING , handler=callback)
        lev = 0
    else:
        speed = utime.ticks_us()-ms
        d0.irq(trigger=machine.Pin.IRQ_RISING , handler=callback)
        lev = 1

这个函数会统计高电平保持的时间(大约10ms),由于函数调用存在开销所以实际测得的时间有一定的偏差。主循环一直模拟中断请求并打印中断的次数,触发的次数和高电平的时间(单位us):

while(True):
    d16.value(0)
    utime.sleep_ms(10)
    d16.value(1)
    utime.sleep_ms(10)
    trig_count = trig_count+1
    print('count:%d,trig count:%d, speed:%d'%(count, trig_count, speed))

全部代码如下:

import machine
import utime
import micropython

micropython.alloc_emergency_exception_buf(100)
d0 = machine.Pin(0,machine.Pin.IN) 
d16 = machine.Pin(16, machine.Pin.OUT)

count = 0
lev = 1
ms = 0
speed = 0
def callback(p):
    global count
    global d0
    global lev
    global ms
    global speed
    count = count+1
    if lev == 1:
        ms = utime.ticks_us()
        d0.irq(trigger=machine.Pin.IRQ_FALLING , handler=callback)
        lev = 0
    else:
        speed = utime.ticks_us()-ms
        d0.irq(trigger=machine.Pin.IRQ_RISING , handler=callback)
        lev = 1

d16.value(0)
d0.irq(trigger=machine.Pin.IRQ_RISING , handler=callback)
trig_count = 0
while(True):
    d16.value(0)
    utime.sleep_ms(10)
    d16.value(1)
    utime.sleep_ms(10)
    trig_count = trig_count+1
    print('count:%d,trig count:%d, speed:%d'%(count, trig_count, speed))

其实这个中断可以用于测量光电编码盘的脉宽,超声波测距等。

扩展阅读:

  • https://docs.micropython.org/en/latest/esp8266/reference/isr_rules.html?highlight=interrupt

  • https://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#pins-and-gpio

本文授权转载自fnd,版权归作者所有,未经允许,请勿转载。
技术之路,共同进步,有优质移动开发、物联网原创文章欢迎发送邮件至 mobilehub@csdn.net或备注(IoT)加微信tm_forever_miss。

228c55fb08e9a1b60a14913f04e03614.jpeg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值