创客孙老师
创客孙老师
发布于 2025-03-24 / 20 阅读
0
0

MicroPython移植到ESP32

MicroPython对乐鑫ESP32系列MCU的移植使用ESP-IDF框架并作为FreeRTOS的任务运行,当前支持了ESP32,ESP32-C3,ESP32-C6,ESP32-S2 和 ESP32-S3 (ESP8266有单独的MicroPython移植)。

支持的特性有:

  • UART0上的REPL(Python提示符)。
  • 可用于MicroPython任务的16KB堆栈和约100K的Python内存堆。
  • 支持大量MicroPython特性:unicode,任意精度的整数(arbitrary-precision integers),单精度浮点数(single-precision floats),复数(complex numbers),冻结的字节码(frozen bytecode),以及许多内部模块。
  • 使用闪存(flash)的内部文件系统(当前是2M大小)。
  • 支持GPIO,UART,SPI,软I2C,ADC,DAC,PWM,TouchPad(触摸板),WDT and Timer。
  • 支持了WLAN (WiFi) 的网络模块。
  • 支持低功耗蓝牙(BLE)的蓝牙模块。

最初的ESP32移植开发由Microbric Pty Ltd. 部分赞助。

设置ESP-IDF和编译环境

MicroPython在ESP32上依赖乐鑫IDF版本5(IoT development framework,又称 SDK)。ESP-IDF包括管理ESP32 MCU所需的库和RTOS,以及管理构建固件所需的构建环境和工具链。

ESP-IDF变化很快,所以MicroPython只支持了它有限的几个版本,当前MicroPython支持的版本有V5.2、V5.2.2、V5.3和V5.4。

安装ESP-IDF的文档可以参考乐鑫入门指南

在Windows环境下,使用WSL(Windows Subsystem for Linux,Windows下的Linux子系统)是安装ESP32工具链和编译项目的最佳选择,需要注意使用WSL要遵循Linux的规则而非Windows。

乐鑫入门指南中介绍了如何通过 install.shinstall.bat脚本下载工具链并设置编译环境,这个步骤可以简单概括为:

使用git clone迁出IDF:

git clone -b v5.2.2 --recursive https://github.com/espressif/esp-idf.git

上面是使用v5.2.2版本,也可以替换为其他支持的版本(注意不需要完整的递归克隆(recursive clone),参见 tools/ci.shci_esp32_setup函数其他更多关于仓库的设置命令。

如果本地已经有了IDF,那么可以checkout一个MicroPython支持的版本,并更新子模块:

cd esp-idf
git checkout v5.2.2
git submodule update --init --recursive

在克隆并迁出(checkout)IDF到当前的版本后,运行 install.sh脚本:

cd esp-idf
./install.sh esp32 # (or install.bat on Windows)
source export.sh   # (or export.bat on Windows)

install.sh步骤只需要执行一次,除非更换 esp32芯片,也可以指定多个要支持的芯片版本,使用逗号分隔即可,如:esp32,esp32s2,或者也可以不指定芯片,就会安装所有支持的乐鑫芯片(速度会很慢)。

需要为每个新会话编写 export.sh

编译固件

在编译前,需要先编译MicroPython的交叉编译器 mpy-cross,可以在仓库的根目录运行:

make -C mpy-cross

然后为ESP32构建MicroPython:

cd ports/esp32
make submodules
make

这会在 build-ESP32_GENERIC/子目录下生成一个合并后的 firmware.bin固件映像文件(该固件映像由bootloader.bin、partitions.bin 和 micropython.bin 组成)。

如果要刷固件,需要先把ESP32连接到PC串口进入引导加载模式(bootloader mode),关于如何操作可参考ESP32的相关文档,同时当前用户还要有 /dev/ttyusb0设备的访问权限,在Linux上,可以通过将用户添加到 dialout组中然后重启电脑或重新登录(注意:在某些发行的linux版本中可能是 uucp组,可以使用 ls -la /dev/ttyUSB0进行查看)。

sudo usermod -aG dialout <username>

如果是第一次烧录固件或者之前已经烧录过其他的固件,需要先擦除ESP32模块的闪存:

make erase

把MicroPython固件烧录到ESP32上可以使用:

make deploy

上面是ESP32的缺省构建构,是 ESP32_GENERIC其中的一种,它适用于大多数ESP32模组,当然也可以通过 BOARD=<board>给make命令传递不同的参数,如:

make BOARD=ESP32_GENERIC_S3

**注意:**上面的"make"命令是对部分ESP-IDF底层编译工具 dif.py的封装,当然也可以直接使用 idf.py

idf.py build
idf.py -D MICROPY_BOARD=ESP32_GENERIC build
idf.py flash

有些电路板还支持一些 “变体(variants)”,允许对原本相似的电路板进行微小改动,例如不同的闪存大小或功能,如,构建 ESP32_GENERICOTA变体:

make BOARD=ESP32_GENERIC BOARD_VARIANT=OTA

或启用 ESP32_GENERIC_S3板子 octal-SPIRAM(八进制的SPIRAM)的支持:

make BOARD=ESP32_GENERIC_S3 BOARD_VARIANT=SPIRAM_OCT

进入设备Python提示符状态

可以通过串行端口UART0进入Python提示符状态,UART0与刷固件的UART相同,REPL的波特率为115200,可以使用下面的命令:

picocom -b 115200 /dev/ttyUSB0

miniterm.py /dev/ttyUSB0 115200

配置WiFi并使用开发板

就模块和应用程序接口而言,ESP32的设计(几乎)等同于ESP8266,其中存在一些微小的差异,特别是在启动时,ESP32 不会自动连接到最后一次连接的热点,但在大多数情况下,ESP8266的文档和教程适用于ESP32(至少适用于已实现的组件)。

快速参考资料参见ESP8266快速参考,教程参见:ESP8266教程

下面的函数可用于连接WiFi热点(可以使用自己的SSID和密码,也可以更改默认值,以便快速调用 wlan_connect(),这样就能正常工作了):

def wlan_connect(ssid='MYSSID', password='MYPASS'):
    import network
    wlan = network.WLAN(network.WLAN.IF_STA)
    if not wlan.active() or not wlan.isconnected():
        wlan.active(True)
        print('connecting to:', ssid)
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

请注意,有些开发板在使用WiFi之前会要求配置天线。在LoPy和WiPy2.0等Pycom开发上,需要执行以下代码来选择内部天线(最好将此行放在 boot.py 文件中):

import machine
antenna = machine.Pin(16, machine.Pin.OUT, value=0)

定制ESP32开发板

目录 boards/ESP32_GENERIC中的 ESP32_GENERIC开发板定义是默认的ESP-IDF配置。对于自定义配置,可以定义自己的开发板目录,并通过复制现有的配置(例如 ESP32_GENERIC)并修改以适合自己的开发板。

Micropython具体的配置在开发板规格文件 mpconfigboard.h中定义,该文件包含在 mpconfigport.h中,其他设置放在 mpconfigboard.cmake中,包括配置ESP-IDF的 sdkconfig文件列表。boards/目录中提供了一些标准的 sdkconfig文件,如 boards/sdkconfig.ble,当然也可以在开发板目录中定义自己的文件。

部署指令通常会调用 boards/deploy.md文件(适用于带有USB/Serial转换器的开发板),或调用 boards/deploy_nativeusb.md文件(适用于仅有内置USB接口的开发板)。这些文件由 boards.json中的模板字符串进行格式化。如果开发板需要通过 RESETBOOT按钮手动复位,也可以包含通用的 boards/deploy_flashmode.md文件。具有独特闪存步骤的开发板可包含自定义的 deploy.md文件。现有的 board.json文件包含了所有组合的示例。

有关配置的更多示例,可参阅现有的开发板定义。

配置故障排除

编程后连续重启:确保开发板的 CONFIG_ESPTOOLPY_FLASHMODE正确无误(例如,ESP-WROOM-32 应为 DIO)。然后执行 make clean、重新编译和部署。


评论