树莓派Raspberry PI PICO的时间定时器中断和按钮中断

编程硬件及软件

pico

硬件:树莓派PICO(安装在扩展接口上,方便接线)

软件:Thonny

语言:Micropython 

什么是中断

1、中断是指硬件或软件发送信号给微处理器或操作系统,以通知其发生了特定事件或需要采取特定操作。

2、中断以异步方式发生,即不需要程序显式地发出请求。

3、中断通常用于响应硬件事件,如输入/输出完成或计时器到期。

4、当一个中断事件发生时,CPU会停止当前正在执行的程序,并跳转到相应的中断处理程序,执行相应的操作。当中断事件处理完成,CPU就会返回到原来的程序继续执行。

中断跟循环检测有什么差别

中断是异步发生的,它们允许计算机系统在执行任务的同时响应并处理事件。换句话说,你可以正常的编写你的主流程,该干么干么。中断机制会在中断发生的时候中断主流程正在执行的程序,先执行中断处理函数,然后再回去主流程。

这个机制可以使编程思路变成比较简单,是一种面向事件的编程思想的体现。

程序实现过程

导入库

import time
from machine import Pin

定义引脚

led25 = Pin(25,Pin.OUT)             #定义25引脚为输出,因为板载的LED灯就接在这个引脚上
sw24  = Pin(24,Pin.IN,Pin.PULL_UP)  #定义24引脚为输入,因为板载的按钮就接在这个引脚上

定义按钮回调函数

#按钮中断回调函数----用户按按钮时将LED闪一下
def led_toggle(sw24):
    led25.value(0)                  
    time.sleep(0.5)
    led25.value(1)    

这里定义一个中断处理函数,特别要强调的是函数的参数是前面已经定义好的sw24,一定要有参数。如果没有参数,后面定义的中断映射,在调用的时候,会自动向这个函数发送引脚号,以表明是哪个引脚发生的中断,所以如果没有这个参数,运行时就会报错:

定义定时器回调函数

#定时器回调函数----定时事件发生时,软件模拟在这个引脚上“按一下按钮”
def myTimerCB(timer1s):
    tempsw= Pin(24, Pin.OUT)                 # 先将这个输入引脚临时变成输出,才可以在后面对它进行电平设置    
    tempsw.value(1)    # 设置高电平
    tempsw.value(0)    # 设置低电平
    tempsw= Pin(24, Pin.IN, Pin.PULL_UP)     # 函数结束时,再将这个引脚设置为输入模式,以便用户可以用手按。

这里需要说明一下,前面“定义引脚”时,已经将24号引脚定义为输入,这里为什么要重新定义为输出呢。因为,经过我实践,程序只能对“输出型”的引脚设置高、低电平。不能对“输入型”引脚设置高、低电平。

在这段函数内部,我们临时将24号引脚设置为输出,然后让LED灯闪一下后,再将24引脚恢复为输入模式,以便用户按的时候有反应。

设置按钮中断和定时器中断

sw24.irq(led_toggle,Pin.IRQ_RISING)          # 定义一个按钮中断
timer1s = machine.Timer()                    # 初始化定时器实例,设置回调函数和时间间隔
timer1s.init(period=6000, mode=machine.Timer.PERIODIC, callback=myTimerCB)    # 定义一个时间定时器

Pin.IRQ_RISING 表示的是上升沿,事件发生在从低电平向高电平变化的那会儿,也就是按钮“抬起”的那一瞬间。当然根据需要,你也可以将这里写成IRQ_FALLING表示事件发生在从高电平向低电平转换的瞬间。

我的一个发现:有中断存在MICROPYTHON主程序就不会结束

正常情况下,我们需要在主程序的最后设置一个while True:循环,里面只有一句话time.sleep(1),以避免主程序执行完毕后就直接退出了。但是,在这个程序里,我并没有写这个循环,主程序也没有退出。反复试验了多次后,也还是这样。

因此,我得出结论,只要有中断存在,则主程序就不需要while循环一直“保活”。请大家一起去试一下,如果不是这样,请麻烦告诉我一下。

完整的程序代码

import time
from machine import Pin

led25 = Pin(25,Pin.OUT)             #定义25引脚为输出,因为板载的LED灯就接在这个引脚上
sw24  = Pin(24,Pin.IN,Pin.PULL_UP)  #定义24引脚为输入,因为板载的按钮就接在这个引脚上

#按钮中断回调函数----用户按按钮时将LED闪一下
def led_toggle(sw24):
    led25.value(0)                  
    time.sleep(0.5)
    led25.value(1)                  

#定时器回调函数----定时事件发生时,软件模拟在这个引脚上“按一下按钮”
def myTimerCB(timer1s):
    tempsw= Pin(24, Pin.OUT)                 # 先将这个输入引脚临时变成输出,才可以在后面对它进行电平设置    
    tempsw.value(1)    # 设置高电平
    tempsw.value(0)    # 设置低电平
    tempsw= Pin(24, Pin.IN, Pin.PULL_UP)     # 函数结束时,再将这个引脚设置为输入模式,以便用户可以用手按。
    
sw24.irq(led_toggle,Pin.IRQ_RISING)          # 定义一个按钮中断
timer1s = machine.Timer()                    # 初始化定时器实例,设置回调函数和时间间隔
timer1s.init(period=6000, mode=machine.Timer.PERIODIC, callback=myTimerCB)    # 定义一个时间定时器

参考链接

中断(计算机术语)_百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值