在Zephyr玩转MicroPython【入门篇】
  m9kCQSVmQX0i 2023年11月02日 27 0

 MicroPython这几年被越来越多的大佬们用在形形色色的嵌入式项目上,Zephyr RTOS本身支持MicroPython的使用,分成入门和进阶两篇来讲讲如何在Zephyr上玩转MicroPython。

本次讲解使用的硬件平台是聆思的CSK6芯片,配套有支持Zephyr RTOS的SDK。

MicroPython是什么

MicroPython是对Python 3特性进行了精简且高效化的一种实现,包括 Python 标准库的一小部分,并且优化到可在单片机和资源有限的环境中运行。其中包含了 Python 中几乎完整的高级语言特性,例如交互式提示、任意精度整数、闭包、列表理解、 生成器、异常处理等。同时,它又可以精简到只需 256K 的 flash 和 16K 的RAM 即可运行。跟C语言相比,MicroPython也有自己的优势,所以越来越多的极客厂商开始向大众介绍如何在嵌入式设备上使用micropython来实现产品案例例如一些智能刷卡系统、体温检测、声控灯等等都可以用micropython来实现完整的产品案例。

C语言

MicroPython

运行方式

编译成二进制文件

作为脚本直接运行

异步编程

不支持

支持

编码体验

关注点多,相对代码量多

上手快,代码量少

环境(SDK)说明

现在的开源社区中主要流行的micropython有两个版本,首先是官方的micropython,可直接在Zephyr上运行,并且根据在Zephyr上封装的标准api适配了GPIO等简单的硬件操作。另一个版本就是由LGVL维护的micropython版本,它在保留了官方的原有特性的前提下适配了LVGL的接口,我们可以使用这个接口实现LVGL的开发,比C语言实现LVGL开发效率更高。

但由于这两个版本都要考虑更全面的适配,所以项目非常庞大,因此本次使用的是聆思裁剪后的SDK,更适合在CSK6芯片的硬件上进行开发。聆思MicroPython SDK对比官方的MircoPython有如下优点。

  • 在满足完整需求的前提下,将SDK资源占用最小化
  • 适配官方未支持的zephyr特性、csk芯片功能(例如wifi联网等)

官方 MicroPython

聆思 MicroPython

对zephyr适配

作为app

作为module

体积

6.x GB

600 MB

LVGL适配

不支持

支持

MicroPython的软件流程与原理

micropython在编译的过程中去尝试构建这个python的解释器,收集要转移成python模块的c代码,然后使这些c 代码在micropython中也可以直接调用,然后把这些东西编译成lipmicropython.a的产物,通过静态链接库的方式作为依赖的存在。

当固件运行起来之后启动这个python虚拟机,然后加载这个文件系统上的这个main.py做运行。脚本运行完成后,就会将这个串口终端来作为这个python的命令行终端。

在Zephyr玩转MicroPython【入门篇】_嵌入式开发

编辑

实操与讲解

开发环境部署

  • Windows系统需要先安装环境,命令行执行:lisa zep use-env csk6-mpy
  • Linux 与 macOS 可忽略此步骤

注意:使用lisa zep命令需要先安装环境工具,可以参考聆思CSK6环境安装进行部署。

拉取代码

lisa zep create --from-git https://cloud.listenai.com/zephyr/applications/app_mpy_sample.git


拉取后的目录结构如下:

在Zephyr玩转MicroPython【入门篇】_嵌入式开发_02

编辑

怎么跟MicroPython固件进行通讯

需要先构建这个文件系统的镜像,然后把镜像烧录到对应的flash地址,操作完成后启动固件才能访问到文件系统。烧录固件需要用到lisa命令行工具,新同学可以参考聆思CSK6开发工具来获得编译环境。跟MicroPython固件进行通讯需要用到mpremote,这是MicroPython官方维护的用于与 MicroPython 固件通讯的串口终端工具,下载地址:https://docs.micropython.org/en/latest/reference/mpremote.html

编译烧录

如下图所示,resource目录下的文件系统内容是构建成镜像烧录到开发板中,

lfs1代表是.overlay里设备树对应的自动挂载flash分区的命名,

reg=<0x265000 0x80000> 指创建一个512KB的文件系统分区来作为分区位置filesystem_part:partition@26500 代表分区的信息

partition = <filesystem_part> 选中filesystem_part挂载到 /flash (由mount-point设定)

mount-point = “/flash” 设置挂载点,固件启动后可以通过该挂载点访问文件系统

在Zephyr玩转MicroPython【入门篇】_嵌入式开发_03

编辑

构建文件系统:

lisa zep fs:build


烧录文件系统:

在Zephyr玩转MicroPython【入门篇】_嵌入式开发_04



连接MicroPython镜像

使用mpremote进行连接, 下载地址:https://docs.micropython.org/en/latest/reference/mpremote.html

或命令行安装:pip install mpremote


连接MicroPython:

windows环境:mpremote

Linux环境:mpremote c onnect /dev/[定义的地址名]

连接成功后按下开发板复位按钮,如下图所示,可以输出hello world的信息,也可以直接在终端就行python的操作。

在Zephyr玩转MicroPython【入门篇】_Zephyr_05

编辑

MicroPython在Zephyr上可以做哪些操作

使用MicroPython可以在CSK6011-NanoKit开发板上做以下操作

外设操作(官方)

GPIO

I2C

SPI

UART

功能(官方)

Flash 读写

DiskAccess存储访问

zsensor访问传感器

socket

csk.wifi_mgr(聆思提供)

适配 WiFi Manager 能力,配合 CSK 网络模块联网

zephyr.net_mgmt(聆思提供)

适配 zephyr DHCPv4 ,用作联网后的 DHCP 分配

GPIO 演示

使用machine.Pin类点亮下图CSK6011-NanoKit开发板上标记的LED绿灯,可使用以下代码直接控制亮灭的操作。

from machine import Pin
pin = Pin(("GPIO_B", 6), Pin.OUT)
pin.value(1)
pin.value(0)


在Zephyr玩转MicroPython【入门篇】_嵌入式开发_06

编辑

pin = Pin(("GPIO_1",21),Pin.IN)                    # create input pin on GPIO1
print(pin)                                                         # print pin port and number


*********************************************************************************

pin.init(Pin.OUT,Pin.PULL_UP,value=1)        # reinitialize pin
pin.value(1)                                                    # set pin to high
pin.value( )                                                    # set pin to low
pin.on()                                                            # set pin to high
pin.off()                                                          # set pin to low


************************************************************************************

pin = Pin(("GPIO_1",21),Pin.IN)                   # create input pin on GPIO1
pin = Pin(("GPIO_1",21),Pin.OUT,value=1)           # set pin high on creation
pin = Pin(("GPIO_1",21),Pin.IN,Pin.PULL_UP)        # enable internal pull-up resistor


**************************************************************************************

switch = Pin(("GPIO_2",6),Pin.IN)                        # create input pin for a switch
switch.irq(lambdat:print("SW2 changed"))         # enable an interrupt when switch


文件系统访问

继续使用前面编译烧录好的CSK6011-NanoKit开发板,读写文件Python示例如下:

在Zephyr玩转MicroPython【入门篇】_嵌入式开发_07


更多学习资源

如果需要获取本教程相关的学习资源、代码,

或者了解更多与嵌入式开发、AI芯片相关的其他课程,可以点击查看目录导航



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
m9kCQSVmQX0i
最新推荐 更多