目录

MicroPython构建指南(ESP32-C3-32S 2M版本)

目录

编译 MicroPython : 为 ESP32-C3-32S 2M 制作固件

前几天买了几块ESP32-C3-32S 2M的开发板,到手发现最新的MicroPython官方固件刷不进去

这是我买的开发板的产品规格书,点我前往

/images/build-my-micropython-for_esp32-c3-32s_2m/part-1.png

幸好,我在MicroPython论坛找到了某国外大佬编译的固件,帖子链接

不过我看了看时间,发现这个固件编译出来已经一年多了。

今天教大家如何为ESP32-C3-32S 2M这块开发板编译最新版(目前是MicroPython 1.19.1)的固件

(如果需要编译其他开发板的MicroPython固件,也可以参考这篇文章)

本次编译固件的环境如下:

1
2
3
系统:Windows 11 专业版(已开启Hyper-V)
Docker Desktop 4.12.0
自备魔法上网(加速Docker镜像拉取)

这次我们使用这个镜像来构建咱们的固件

/images/build-my-micropython-for_esp32-c3-32s_2m/part-2.png

镜像的Docker Hub链接

启动Docker,打开CMD窗口,运行以下命令拉取镜像

(打开魔法以便提高速度)

1
docker pull shaoziyang/micropython-builder

等命令执行完之后,打开Docker Desktop,点击左边的Images,找到这个东东,点击Run运行

/images/build-my-micropython-for_esp32-c3-32s_2m/part-3.png

(温馨提示:没有Run按钮的话,把鼠标移上去就有了QWQ)

/images/build-my-micropython-for_esp32-c3-32s_2m/part-4.png

运行之后,点击左侧的Containers就能看到刚刚启动的容器了~

/images/build-my-micropython-for_esp32-c3-32s_2m/part-5.png

点进去,找到右上角CLI

/images/build-my-micropython-for_esp32-c3-32s_2m/part-6.png

此时命令行是这样的:

/images/build-my-micropython-for_esp32-c3-32s_2m/part-7.png

先输入su命令

1
2
# su
root@3bd2aa5b1cd0:/#

先ls一下看看有哪些目录

1
2
3
4
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文件夹

1
2
3
4
5
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官网 下载最新版的压缩包

/images/build-my-micropython-for_esp32-c3-32s_2m/part-8.png

在容器中继续操作,新建一个文件夹,用docker cp把解压的文件夹放进去

1
2
3
4
5
6
7
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进来了

1
2
3
4
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目录

1
2
3
4
5
6
7
8
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吧

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 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

1
2
3
4
5
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进去之后,有这些文件:

1
2
3
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

1
2
3
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

构建完成之后:

1
2
3
4
5
6
7
8
9
(略)
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一下看看吧!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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到这个文件夹里面

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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命令把它复制到主机,用官网提供的命令把它烧录到开发板中即可。

1
2
3
4
# 擦除
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里发现了这个镜像并编译成功。想到一些网友也有可能被这个问题困扰,于是搞(水)了篇文章。

如果有问题,欢迎评论区留言哦!