电子产业一站式赋能平台

PCB联盟网

搜索
查看: 27|回复: 0
收起左侧

MicroPython的魔法开关:上电即运行,让你的设备秒变智能!

[复制链接]

162

主题

162

帖子

1268

积分

三级会员

Rank: 3Rank: 3

积分
1268
发表于 昨天 09:00 | 显示全部楼层 |阅读模式
说起MicroPython,相信大家都不会陌生,这是一种基于Python3的高效实现,专为微控制器和嵌入式系统设计。是一款能够在嵌入式平台运行的Python解析器,换句话说,我们就可以使用Python进行程序编写,来实现对于嵌入式平台(以下统称MCU平台)的控制。
不过,相较于使用C/C++进行程序编写的方式,Python代码无需编译成镜像文件烧写到平台中。这也是Python作为一款解释型语言的一大优势,即无需进行编译、链接、烧写的三步走,即可成功运行程序。但是也存在一个新问题,那就是程序要放到哪呢?针对对此,MicroPython有一个叫做REPL的基于串口的交互式程序编写模式,简单来说,用户可以通过打开串口连接到MCU平台。随后即可进行代码编写。这时候,出现一个新问题,每次都要先用串口连接才可以运行程序吗?
当然不,不然每次代码运行,都要拖着一台大大的电脑,是不是想想都要摇头。那么今天小编就给大家来介绍几种让代码能够在上电时候直接运行的方式。平台我们这里就选择i.MX RT1060平台,代码链接:https://github.com/micropython/micropython,  i.MXRT1060平台介绍在这里:https://github.com/micropython/micropython/tree/master/ports/mimxrt,这里也可以找到对应的编译和运行方法,就不再赘述了。
好,那我们直接开始,首先让代码能够运行,需要首先解决的问题是,代码放在哪?才能让MicroPython的解析器上电就能找到并打开运行。首先我们想到的就是放到某个文件系统,那让我们看看i.MXRT1060的文件系统的支持情况:

3w1bbhuve0564010613246.png

3w1bbhuve0564010613246.png

这里我们可以看到,RT系列同时支持内部flash以及SDCard,也就是说,有两个地方可以放,无论是内部flash还是SD卡。这里可能大家就会有疑问,这里有两个文件系统,MicroPython(以下简称MP)怎么知道我用的哪个呢?这里就要分析下代码了,在MP的main.c中有这么段代码:https://github.com/micropython/micropython/blob/master/ports/mimxrt/main.c#L114
         pyexec_frozen_module("_boot.py", false);
也就是说,在main函数执行时候,要执行一个叫_boot.py的python脚本,那么这个脚本干了什么呢?代码在这里:https://github.com/micropython/micropython/blob/master/ports/mimxrt/modules/_boot.py

lmfwn3ineom64010613346.png

lmfwn3ineom64010613346.png

主要看下红色标记的地方,在1处,首先挂在了flash文件系统到/flash目录。随后,代码会检测这个flash文件系统中是否有叫做”SKIPSD”的文件,如果有的话,就说明我们要跳过挂载SDcard文件系统。如果没有的话,便会执行2处,挂载SD卡文件系统来替代之前所挂载的flash文件系统。
好了,这里我们就清楚了,这两个文件系统是二选一的,首先是flash文件系统。随后如果存在SD卡那就会挂载SD卡文件系统。解决了这个问题,问题就简单了。我们只需要二选一,将代码放到SD卡中就行了。
没错,但是还漏了一个细节。MP只能识别某种名字的文件的,这个继续看代码:

uztjctuh4je64010613446.png

uztjctuh4je64010613446.png

在main.c中,程序会去查找有没有一个叫做main.py的文件,并执行它。因此,我们需要将想要运行的程序命名为main.py,并将其放置在文件系统中即可。具体来说,这个文件系统是flash还是SDcard文件系统,就看大家自行选择了。这里我们将其放置在SD卡中:

xats3bzpyek64010613546.png

xats3bzpyek64010613546.png

程序内容,这里通过MP自己的REPL串口打印”Boot From SD”, 随后打开一个新的串口,打印输出’1234’
print("Boot  From SD")
from machine import UART
uart = UART(0, 115200)
uart.write(b'1234\r
')
程序运行结果:

eyszxtiuiwp64010613646.png

eyszxtiuiwp64010613646.png

可以看到在右边REPL串口打印出MP信息前,会打印出Boot From SD,在左边所打开的新串口中会打印出1234。符合程序预期,实现了程序的自启动。
下一期将给大家带来一个不依赖于文件系统的方案。咱们拭目以待吧~
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表