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.sh
或 install.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.sh
的 ci_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_GENERIC
的 OTA
变体:
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
中的模板字符串进行格式化。如果开发板需要通过 RESET
和 BOOT
按钮手动复位,也可以包含通用的 boards/deploy_flashmode.md
文件。具有独特闪存步骤的开发板可包含自定义的 deploy.md
文件。现有的 board.json
文件包含了所有组合的示例。
有关配置的更多示例,可参阅现有的开发板定义。
配置故障排除
编程后连续重启:确保开发板的 CONFIG_ESPTOOLPY_FLASHMODE
正确无误(例如,ESP-WROOM-32 应为 DIO)。然后执行 make clean
、重新编译和部署。