亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

[Python玩轉物聯網]Micropython GPIO IRQ處理

標簽:
Java Python

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


IRQ.png


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

micropython.alloc_emergency_exception_buf(100)

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

micropython.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))

其实这个中断可以用于测量光电编码盘的脉宽,超声波测距等。
扩展阅读:
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

    链接:https://www.jianshu.com/p/8a4645047103


    點擊查看更多內容
    TA 點贊

    若覺得本文不錯,就分享一下吧!

    評論

    作者其他優質文章

    正在加載中
    • 推薦
    • 評論
    • 收藏
    • 共同學習,寫下你的評論
    感謝您的支持,我會繼續努力的~
    掃碼打賞,你說多少就多少
    贊賞金額會直接到老師賬戶
    支付方式
    打開微信掃一掃,即可進行掃碼打賞哦
    今天注冊有機會得

    100積分直接送

    付費專欄免費學

    大額優惠券免費領

    立即參與 放棄機會
    微信客服

    購課補貼
    聯系客服咨詢優惠詳情

    幫助反饋 APP下載

    慕課網APP
    您的移動學習伙伴

    公眾號

    掃描二維碼
    關注慕課網微信公眾號

    舉報

    0/150
    提交
    取消