|
pyboard 有两个按键USR和RST。RST是硬件重启的按键。
USR 按键用户可以来使用,通过调用Switch对象。如下所示:
记得包含 pyb, import pyb;
通过调用可以得到如下的按键状态:
未按下USR按键的时候打印 False,按下 USR按键的时候打印 True
5.1 Switch callbacks
switch 虽然是一个很简单的对象。但它具有一个高级的功能就是回调函数 sw.callback().
当按键被按下的时候调用回调函数,执行中断,回调函数内的内容。
- >>> sw.callback(lambda:print('press!'))
复制代码 上面的内容是,当按键被按下的时候打印“press!”。
下面的函数LED 的亮灭绑定到switch函数上,
- >>> sw.callback(lambda:pyb.LED(1).toggle())
复制代码 可以将任何函数(不带参数)的回调函数,以上我们使用Python的lambda特征来动态创建一个匿名函数。但我们可以同样做:
- >>> def f():
- ... pyb.LED(1).toggle()
- ...
- >>> sw.callback(f)
复制代码
请注意,您的回调函数不能分配任何内存(例如它们不能创建一个元组或列表)。回调函数应该是比较简单的。如果你需要做一个列表,事先把它做一个列表,把它存储在一个全局变量(或使它靠近它)。如果你需要做一个长期的、复杂的计算,然后用这个回调来设置一个标志,然后再通过一些其他的代码来响应。
5.2 中断
让我们一步一步,通过探索Switch回调函数的细节。当注册了sw.callback()函数,switch 设置了按键引脚的外部中断触发(下降沿)。这意味着,微控制器将检测引脚的任何变化,并将发生以下:
(1)当开关被压的变化发生在引脚(电平从低到高),微控制器的寄存器相应的发生变化。
(2)微控制器完成当前机器指令的执行,停止执行,并保存其当前状态(将寄存器压入栈中)。这已暂停任何代码的效果,例如您运行Python脚本。
(3)微控制器开始执行与该开关的外部触发相关联的特殊中断处理程序。这个中断处理callback()中注册的函数,并且执行它。
(4)你的回调函数被执行,直到它完成,返回控制权的切换中断处理程序。
(5)switch中断处理程序返回,并且通知MCU中断已处理。
(6)微控制器恢复的状态,是它在步骤2中保存的状态,即是中断处理前的状态。
(7)正在开始运行的代码的执行继续。除了短时间的停顿,这个代码没有注意到它被中断了。
当多个中断同时发生时,上述事件序列会变得更加复杂。在这种情况下,中断与最高优先级的先去,然后其他人以他们的优先级。切换中断以最低优先级设置。
5.3 更多
更多关于中断方面的信息,请阅读(http://docs.micropython.org/en/l ... ules.html#isr-rules)
|
|