博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 玩转物联网之 Micropython GPIO IRQ 处理
阅读量:2507 次
发布时间:2019-05-11

本文共 1968 字,大约阅读时间需要 6 分钟。

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

IRQ

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

micropython.alloc_emergency_exception_buf(100)

分配中断异常处理的堆栈,因为中断和正常运行的情况使用的是不同的堆栈,所以需要单独分配,另外在中断处理函数中尽量少开辟变量以免出现内存不足的情况,另外中断处理需要尽量快,所以最好不要用print之类的语句,请参考:

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

count = 0lev = 1ms = 0speed = 0def 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 machineimport utimeimport micropythonmicropython.alloc_emergency_exception_buf(100)d0 = machine.Pin(0,machine.Pin.IN) d16 = machine.Pin(16, machine.Pin.OUT)count = 0lev = 1ms = 0speed = 0def 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 = 1d16.value(0)d0.irq(trigger=machine.Pin.IRQ_RISING , handler=callback)trig_count = 0while(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))

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

扩展阅读:

本文授权转载自,版权归作者所有,未经允许,请勿转载。

技术之路,共同进步,有优质移动开发、物联网原创文章欢迎发送邮件至 或备注(IoT)加微信tm_forever_miss。

你可能感兴趣的文章
Microsoft Dynamics CRM 前瑞开发
查看>>
html5中的一些标签学习总结
查看>>
Leaflet中添加的不同图层样式图标
查看>>
需求管理
查看>>
Android Listview 性能优化
查看>>
JQuery中this指向
查看>>
Ubuntu 16.04安装idea
查看>>
记录在Spring-Boot中使用Fegin调用RESTfull的PATCH方法设置
查看>>
PostgreSQL增强版命令行客户端(pgcli)
查看>>
Maven属性(properties)标签的使用
查看>>
svn 常用操作命令
查看>>
solr7.4 centos7安装
查看>>
js实现的文件下载
查看>>
安装redis出现cc adlist.o /bin/sh:1:cc:not found
查看>>
selenium的三种等待时间
查看>>
PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM
查看>>
php如何解决中文乱码问题?
查看>>
浅析SQL Server 2005中的主动式通知机制
查看>>
51nod1347(简单逻辑)
查看>>
51nod1127(尺取法)
查看>>