【归档】MicroPython构建指南(ESP32-C3-32S 2M版本)
说明
此篇文章从旧版博客系统中迁移,正文排版及外链资源可能失效,同时请注意内容时效性。
正文
编译 MicroPython : 为 ESP32-C3-32S 2M 制作固件
前几天买了几块ESP32-C3-32S 2M的开发板,到手发现最新的MicroPython官方固件刷不进去
这是我买的开发板的产品规格书, 点我前往
幸好,我在MicroPython论坛找到了某国外大佬编译的固件, 帖子链接
不过我看了看时间,发现这个固件编译出来已经一年多了。
今天教大家如何为ESP32-C3-32S 2M这块开发板编译最新版(目前是MicroPython 1.19.1)的固件
(如果需要编译其他开发板的MicroPython固件,也可以参考这篇文章)
本次编译固件的环境如下:
系统:Windows 11 专业版(已开启Hyper-V)
Docker Desktop 4.12.0
自备魔法上网(加速Docker镜像拉取)
这次我们使用这个镜像来构建咱们的固件
启动Docker,打开CMD窗口,运行以下命令拉取镜像
(打开魔法以便提高速度)
docker pull shaoziyang/micropython-builder
等命令执行完之后,打开Docker Desktop,点击左边的Images,找到这个东东,点击Run运行
(温馨提示:没有Run按钮的话,把鼠标移上去就有了QWQ)
运行之后,点击左侧的Containers就能看到刚刚启动的容器了~
点进去,找到右上角CLI
此时命令行是这样的:
先输入su命令
# su
root@3bd2aa5b1cd0:/#
先ls一下看看有哪些目录
root@3bd2aa5b1cd0:/# ls
bin dev esp-open-sdk home lib32 libx32 micropython opt root sbin sys users.txt var
boot esp-idf etc lib lib64 media mnt proc run srv tmp usr
root@3bd2aa5b1cd0:/#
进入到micropython文件夹
root@3bd2aa5b1cd0:/# cd micropython
root@3bd2aa5b1cd0:/micropython# ls
ACKNOWLEDGEMENTS CODEOFCONDUCT.md LICENSE docs examples lib mpy-cross py tests
CODECONVENTIONS.md CONTRIBUTING.md README.md drivers extmod logo ports shared tools
root@3bd2aa5b1cd0:/micropython#
接着,去 MicroPython官网 下载最新版的压缩包
在容器中继续操作,新建一个文件夹,用docker cp把解压的文件夹放进去
root@3bd2aa5b1cd0:/micropython# mkdir 1.19.1
root@3bd2aa5b1cd0:/micropython# ls
1.19.1 CODECONVENTIONS.md CONTRIBUTING.md README.md drivers extmod logo ports shared tools
ACKNOWLEDGEMENTS CODEOFCONDUCT.md LICENSE docs examples lib mpy-cross py tests
root@3bd2aa5b1cd0:/micropython# cd 1.19.1
root@3bd2aa5b1cd0:/micropython/1.19.1# ls
root@3bd2aa5b1cd0:/micropython/1.19.1#
(温馨提示:不会使用docker cp命令的请见 菜鸟教程 - Docker cp 命令 )
接下来,修改代码(或者用docker cp上传已经修改好的代码),然后找到指定的版型,make编译即可
当然,如果你是想为ESP32-C3-32S 2M构建固件,那么你可以接着往下看
(这里为了方便,我就直接使用我之前编译的时候用的容器来演示了)
此时我已经用docker cp命令把最新版的MicroPython源码copy进来了
root@68eecf5f0246:/micropython/1.19.1# ls
ACKNOWLEDGEMENTS CODEOFCONDUCT.md LICENSE docs examples lib mpy-cross py tests
CODECONVENTIONS.md CONTRIBUTING.md README.md drivers extmod logo ports shared tools
root@68eecf5f0246:/micropython/1.19.1#
这里先cd到ports目录,再cd到esp32目录,再cd到boards目录
root@68eecf5f0246:/micropython/1.19.1# cd ports
root@68eecf5f0246:/micropython/1.19.1/ports# ls
bare-arm esp32 javascript minimal pic16bit qemu-arm rp2 stm32 unix zephyr
cc3200 esp8266 mimxrt nrf powerpc renesas-ra samd teensy windows
root@68eecf5f0246:/micropython/1.19.1/ports# cd esp32
root@68eecf5f0246:/micropython/1.19.1/ports/esp32#
root@68eecf5f0246:/micropython/1.19.1/ports/esp32# cd boards
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards#
现在要在这个目录里创建个文件夹,就叫GENERIC_C3_2MB吧
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards# mkdir GENERIC_C3_2MB
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards# ls
ESP32_S2_WROVER GENERIC_S2 LOLIN_S2_PICO UM_TINYPICO manifest.py sdkconfig.nimble_core1
GENERIC GENERIC_S3 M5STACK_ATOM UM_TINYS2 manifest_release.py sdkconfig.spiram
GENERIC_C3 GENERIC_S3_SPIRAM SIL_WESP32 UM_TINYS3 manifest_test.py sdkconfig.spiram_sx
GENERIC_C3_2MB GENERIC_SPIRAM UM_FEATHERS2 deploy.md sdkconfig.240mhz sdkconfig.usb
GENERIC_C3_USB LILYGO_TTGO_LORA32 UM_FEATHERS2NEO deploy_c3.md sdkconfig.base
GENERIC_D2WD LOLIN_C3_MINI UM_FEATHERS3 deploy_s2.md sdkconfig.ble
GENERIC_OTA LOLIN_S2_MINI UM_PROS3 deploy_s3.md sdkconfig.nimble_core0
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards#
然后cd到刚才创建的目录。现在需要在本地新建几个文件,然后用docker cp复制进去
文件:mpconfigboard.cmake
set(IDF_TARGET esp32c3)
set(SDKCONFIG_DEFAULTS
boards/sdkconfig.base
boards/sdkconfig.ble
boards/GENERIC_C3_2MB/sdkconfig.board
)
if(NOT MICROPY_FROZEN_MANIFEST)
set(MICROPY_FROZEN_MANIFEST ${MICROPY_PORT_DIR}/boards/manifest.py)
endif()
文件:mpconfigboard.h
// This configuration is for a generic ESP32C3 board with 2MB of flash.
#define MICROPY_HW_BOARD_NAME "Generic ESP32-D2WD module"
#define MICROPY_HW_MCU_NAME "ESP32-D2WD"
#define MICROPY_HW_BOARD_NAME "ESP32C3 module"
#define MICROPY_HW_MCU_NAME "ESP32C3"
#define MICROPY_HW_ENABLE_SDCARD (0)
#define MICROPY_PY_MACHINE_DAC (0)
#define MICROPY_PY_MACHINE_I2S (0)
文件:sdkconfig.board
CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-2MiB.csv"
全部docker cp进去之后,有这些文件:
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards/GENERIC_C3_2MB# ls
mpconfigboard.cmake mpconfigboard.h sdkconfig.board
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards/GENERIC_C3_2MB#
返回到esp32目录,运行命令:make BOARD=GENERIC_C3_2MB
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards/GENERIC_C3_2MB# cd ..
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/boards# cd ..
root@68eecf5f0246:/micropython/1.19.1/ports/esp32# make BOARD=GENERIC_C3_2MB
构建完成之后:
(略)
Project build complete. To flash, run this command:
/root/.espressif/python_env/idf4.4_py3.8_env/bin/python ../../../../esp-idf/components/esptool_py/esptool/esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip esp32c3 write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 build-GENERIC_C3_2MB/bootloader/bootloader.bin 0x8000 build-GENERIC_C3_2MB/partition_table/ partition-table.bin 0x10000 build-GENERIC_C3_2MB/micropython.bin
or run 'idf.py -p (PORT) flash'
bootloader @0x000000 15984 ( 16784 remaining)
partitions @0x008000 3072 ( 1024 remaining)
application @0x010000 1367888 ( 73904 remaining)
total 1433424
root@68eecf5f0246:/micropython/1.19.1/ports/esp32#
此时不要执行上面的命令!
先ls一下看看吧!
root@68eecf5f0246:/micropython/1.19.1/ports/esp32# ls
CMakeLists.txt machine_adc.c machine_timer.c modnetwork.h partitions-16MiB-ota.csv
Makefile machine_adc.h machine_touchpad.c modsocket.c partitions-16MiB.csv
README.md machine_adcblock.c machine_uart.c modules partitions-2MiB.csv
README.ulp.md machine_adcblock.h machine_wdt.c moduos.c partitions-8MiB.csv
boards machine_bitstream.c main modutime.c partitions-ota.csv
build-GENERIC_C3_2MB machine_dac.c main.c mpconfigport.h partitions.csv
esp32_nvs.c machine_hw_spi.c makeimg.py mphalport.c qstrdefsport.h
esp32_partition.c machine_i2c.c memory.h mphalport.h uart.c
esp32_rmt.c machine_i2s.c modesp.c mpnimbleport.c uart.h
esp32_ulp.c machine_pin.c modesp32.c mpthreadport.c usb.c
fatfs_port.c machine_pwm.c modesp32.h mpthreadport.h usb.h
gccollect.c machine_rtc.c modmachine.c network_lan.c usb_serial_jtag.c
gccollect.h machine_rtc.h modmachine.h network_ppp.c usb_serial_jtag.h
help.c machine_sdcard.c modnetwork.c network_wlan.c
root@68eecf5f0246:/micropython/1.19.1/ports/esp32#
已经出现了build-GENERIC_C3_2MB文件夹!
cd到这个文件夹里面
root@68eecf5f0246:/micropython/1.19.1/ports/esp32# cd build-GENERIC_C3_2MB
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/build-GENERIC_C3_2MB# ls
CMakeCache.txt config.env frozen_mpy partition_table
CMakeFiles esp-idf genhdr project_description.json
app-flash_args firmware.bin kconfigs.in project_elf_src_esp32c3.c
bootloader flash_app_args kconfigs_projbuild.in rules.ninja
bootloader-flash_args flash_args ldgen_libraries sdkconfig
bootloader-prefix flash_args.in ldgen_libraries.in sdkconfig.combined
build.ninja flash_bootloader_args micropython.bin sdkconfig.combined.in
cmake_install.cmake flash_project_args micropython.elf x509_crt_bundle.S
compile_commands.json flasher_args.json micropython.map
config frozen_content.c partition-table-flash_args
root@68eecf5f0246:/micropython/1.19.1/ports/esp32/build-GENERIC_C3_2MB#
这个firmware.bin就是我们编译出来的固件了。使用docker cp命令把它复制到主机,用官网提供的命令把它烧录到开发板中即可。
# 擦除
esptool.py --chip esp32c3 --port /dev/ttyUSB0(改成你开发板连接的端口) erase_flash
# 烧录
esptool.py --chip esp32c3 --port /dev/ttyUSB0(改成你开发板连接的端口) --baud 460800 write_flash -z 0x0 firmware.bin(改成你自己的文件路径)
PS:作者之前买了这个开发板,一直深受这个问题困扰,多次尝试在主机环境以及Linux子系统中尝试编译MicroPython失败后,某天在Docker Hub里发现了这个镜像并编译成功。想到一些网友也有可能被这个问题困扰,于是搞(水)了篇文章。
如果有问题,欢迎评论区留言哦!