micropython 中断_[Micropython]TPYBoardV10X教程6 按键开关,回调函数和中断_weixin_39887546的博客-程序员秘密

技术标签: micropython 中断  

原创版权归山东萝卜科技有限公司所有,转载必须以链接形式注明作者和原始出处。

tpyboard 开发板上有两个小按键,分别标示为 USR 和 RTS。RTS 按键属于复位按键,如果按下的话将重新擦写重启开发板,相当于将开发板断电再重启。

USR按键供用户使用,且其可以通过声明一个按键对象(Switch object)进行控制。创建开关对象的方法如下:>>> sw = pyb.Switch()

当提示 pyb 不存在的错误出现时 ,其大意为你忘记键入 import pyb 语句。

利用按键对象可以得到按键的状态:

>>> sw()

False

如果按键被按下将打印 True ,松开则打印 False 。可以尝试运行上述指令时按下 USR 按键。

1、按键回调函数

尽管按键算是一种简单的构造,但它具有明显的优势特征:sw.callback( ) 函数。该回调函数将在按键按下时创建一些东西,且使用了一个中断。在理解中断工作机制前最好用一个例子进行描述。尝试在解释器里边运行如下的代码:>>> sw.callback(lambda:print('press!'))

这个例程要求每次按下按键时都能打印 press! 字符。先进行尝试:按下USR按键并观测你 PC 上的输出。注意该打印将打断目前你在 pyborad 板上的任何程序,且其属于一种异步中断例程。

可以尝试如下另一个例子:>>> sw.callback(lambda:pyb.LED(1).toggle())

这将在每次按键按下时翻转 LED 的亮灭状态,且其能打断目前其他代码的运行。

关闭按键回调,只需将回调函数的参数设置为 None 即可。>>> sw.callback(None)

你可以传递不带参数的函数作为参数给按键回调函数使用。所以我们可以充分利用 Python 中的 lamba 声明特性。但我们可以用下面的形式替代:

>>> sw = pyb.Switch()

>>> def f():

...     pyb.LED(1).toggle()

...

>>> sw.callback(f)

这将创建一个名为 f 的函数并将其传递给按键回调函数。当 lamba 比较复杂时你可以尝试使用这种方法。

注意回调函数一定不能含有任何分配内存的定义(比如不能声明创建列表和元组)。回调函数越简单越好。如果确切需要定义列表,请在使用回调函数前定义并用一个全局变量存储(或者定义为局部变量并对其进行封装?)。如果需要多次复杂的计算,那么可以用按键回调设置一个标志供其他代码响应使用。

2、中断的原理细节

现在谈谈按键回调函数发生时的细节。当你调用了含有 sw.callback( )的函数时,按键将在其连接引脚产生一个边沿触发(下降沿)外部中断。这意味着芯片将监听该引脚的任何状态变换,且如下事情会发生:

1.当按键被按下时引脚将发生改变(电平由低到高?),芯片处理器将记录这种变化;

2.处理器完成当前机器指令,退出执行状态并保存当前的状态(将寄存器的内容推入栈中)。这将停止当前运行的任何代码,例如正在执行着的 python 脚本;

3.芯片开始执行与按键相关的特定外部中断触发处理。该处理指向你在 sw.callback( )函数中指定的函数功能并执行之;

4.直到回调函数执行完毕,控制主权将回到中断处理手上;

5.按键中断处理将返回,芯片处理器确认记录该中断被执行过;

6.芯片调回步骤 2 的状态;

7.继续执行开始时的代码,除了短暂的暂停,这部分代码看起来似乎没有被打断过。

当同一时间多个中断同时发生上述的过程将复杂得多。这种情况下拥有最高优先级别的中断将被首先执行,其他的中断按各自的优先级数序执行。按键中断的优先级最低。

3、进一步参考

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39887546/article/details/110556668

智能推荐

matlab 16qam误码率图,16QAM理论误码率与实际误码率MATLAB仿真程序(最新整理)_御坂1995的博客-程序员秘密

《16QAM理论误码率与实际误码率MATLAB仿真程序(最新整理)》由会员分享,可在线阅读,更多相关《16QAM理论误码率与实际误码率MATLAB仿真程序(最新整理)(5页珍藏版)》请在人人文库网上搜索。1、16QAM%等效基带调制clc;clear all;close all;%关闭所有窗口,比如之前画的图nsymbol = 10000;%每种信噪比下符号数的发送符号数,106 个数errorn...

docker\docker-compose安装_卢舍那的博客-程序员秘密

docker安装1、先卸载之前的 yum list installed |grep docker yum remove docker-ce docker-ce-cli containerd2、安装显示支持的版本:yum list docker --showduplicates | sort -r安装:yum install docker-ce-17.06.2.ce-1.el7.centos -y3、启动systemctl start dockerdocker-compose安装1、

网络:W5500用浏览器配置设备_weixin_30517001的博客-程序员秘密

1.背景嵌入式端使用网络通信后,可以在PC端进行设备配置。方法有二:1)上位机配置;2)浏览器配置。上位机配置可以把设置和测量作为一体,功能可以很强大,体验较好。浏览器配置就是在电路板上搭载一个嵌入式的web服务器,所以功能一般的很有限。特定情况下,搭载一个浏览器设置接口,可以大大方便设备的使用,毕竟是个电脑就肯定有浏览器的。2.W5500浏览器配置例程分析1)界面如...

python init函数_Python __init__()和__del__()函数的用法_weixin_39900180的博客-程序员秘密

__init__()(后续称之为初始化函数)是用来初始化实例对象的。每次构造一个实例对象时,都会调用该类的初始化函数。在该初始化函数中可以初始化实例对象,或者更新类的某些属性,如该类构造出来的实例对象的个数。初始化函数也可以带参数,通过不同参数来构造不同的实例对象。初始化函数的样式如下:__init__(self, 参数列表)下面定义一个没有其他参数的初始化函数:>>> class Student...

记录php7 curl请求报Segmentation fault: 11的解决过程_十年一剑o的博客-程序员秘密

因为macbook pro送修,在新的mac电脑搭建了php7.1的环境,在跑脚本的时候报Segmentation fault: 11,脚本中请求了一些外部接口,没什么特殊的逻辑。查询无果之后。决定打开coredump 看下进程crash信息问题追溯首先打开coredump➜ ~ ulimit -c unlimited // 开启核心转储然后重新执行脚本,不出意外 Segmentat...

随便推点

SP2-0667: Message file sp1<lang>.msb not found sqlplus oracle_金士顿的博客-程序员秘密

up vote0 down vote favorite1I've a linux RedHat which contains oracle database. I setted all environnement variables, but when I runningsqlplus command I've this error : SP2-0667

swingbench运行在linux里面,Swingbench安装前的准备工作(代码)_李妙文-赵可心的博客-程序员秘密

1.确认安装的平台与java,oracle相关配置[email protected]:~&gt; cat /etc/issue #查看系统版本3.4.Welcome to SUSE Linux Enterprise Server 10 SP3 (x86_64) - Kernel \r (\l)[email protected]:~&gt; java -version #使用这个方式即可确认jave当前的版本...

计算机毕业设计-ssm餐厅点餐系统源码-餐厅选座管理系统代码-餐厅订餐管理系统javaweb项目_QQ_2105837402的博客-程序员秘密

计算机毕业设计-ssm餐厅点餐系统源码-餐厅选座管理系统代码-餐厅订餐管理系统javaweb项目注意:该项目只展示部分功能,如需了解,评论区咨询即可。作者:IT跃迁谷1.开发环境开发语言:Java后台框架:SSM(Spring+SpringMVC+Mybatis)数据库:MySQL架构:B/S源码类型: Web编译工具:Idea、Eclipse、MyEclipse (选其一)其他:jdk1.8、Tomcat8.0 、Maven2.系统的设计与实现2.1 用户类型用户角色分为

ConsumerRecord API_MakeGreatEffort的博客-程序员秘密_consumerrecord

ConsumerRecord API用于从Kafka集群接收记录。 此API由主题名称,分区号(从中接收记录)和指向Kafka分区中的记录的偏移量组成。ConsumerRecord类用于创建具有特定主题名称,分区计数和&amp;lt; key,value&amp;gt;的消费者记录。 对。 它有以下签名。public ConsumerRecord(string topic,int partition, long ...

es java 模糊查询_java使用elasticsearch进行模糊查询_weixin_39774490的博客-程序员秘密

java使用elasticsearch进行模糊查询使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路,具体实现大家可以看后面文章,若其中有不适,请大家多多包涵一、ES模糊查询(一)不含中文模糊查询,适用于数字SearchResponse searchResponse=null;//连接elastics...

Mycat 开发调试环境配置-开启二次开发之路_boonya的博客-程序员秘密

Mycat是 数据库分库分表中间件。mycat1.6分库分表特性只能选择其一,不能同时存在,对于特殊应用场景既需要分库有需要分表,这就需要修改mycat的源码来实现了。今次我们来准备一下Mycat的开发调试环境。官网参考地址:http://www.mycat.io/