CircuitPython 主要由 Adafruit 维护,但是仅支持他们销售的开发板,并且 Adafruit 在撰写本文时不销售任何 ESP32-S3-WROOM-1-N16R8 板。
如果你没有设置正确的 ESP-IDF 配置,开发板将无法成功启动并持续抛出如下异常:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x2b (SPI_FAST_FLASH_BOOT)
Saved PC:0x40378514
SPIWP:0xee
mode:DIO, clock div:2
load:0x3fcd0108,len:0x132c
load:0x403b6000,len:0xb80
load:0x403ba000,len:0x2ea8
entry 0x403b6238
设置开发板编译参数
cp -r espressif_esp32s3_devkitc_1_n8r2 espressif_esp32s3_devkitc_1_n16r8
(Adafruit 不支持N16R8
, 所以选择一个带有 PSRAM 的 ESP32-S3 板子更容易修改)- 编辑
mpconfigboard.h
- 修改
MICROPY_HW_BOARD_NAME
:ESP32-S3-DevKitC-1-N8R2
为ESP32-S3-DevKitC-1-N16R8
- 修改
- 编辑
mpconfigboard.mk
- 修改
USB_PRODUCT
:ESP32-S3-DevKitC-1-N8R2
为ESP32-S3-DevKitC-1-N16R8
- 修改
CIRCUITPY_ESP_FLASH_MODE
:dio
为qio
(DIO to QIO for Flash) - 修改
CIRCUITPY_ESP_FLASH_SIZE
:8MB
为16MB
(8MB to 16MB for Flash)
- 修改
- 编辑
sdkconfig
- 修改
CONFIG_SPIRAM_MODE_QUAD=y
为CONFIG_SPIRAM_MODE_OCT=y
(QUAD to OCTAL for PSRAM) - 修改
CONFIG_SPIRAM_SIZE
:2097152
为8388608
(2MB to 8MB for PSRAM)
- 修改
以上配置基于 ESP32-S3 文档,主要修改 flash 大小和 flash 模式。
我制作了一个 docker 文件来编译 CircuitPython 固件。
# https://learn.adafruit.com/building-circuitpython/build-circuitpython
# https://docs.circuitpython.org/en/latest/BUILDING.html
# https://learn.adafruit.com/building-circuitpython/espressif-build
FROM python:3
USER root
RUN apt-get update && apt-get -y install \
git \
ninja-build cmake libusb-1.0-0 gettext
WORKDIR /root
# it's taking a long time
RUN git clone https://github.com/adafruit/circuitpython.git && \
cd circuitpython && \
git checkout 7.3.3 && \
make fetch-submodules
WORKDIR /root/circuitpython/ports/espressif
RUN esp-idf/install.sh
WORKDIR /root/circuitpython/ports/espressif/boards
# https://github.com/adafruit/circuitpython/tree/main/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2
RUN cp -r espressif_esp32s3_devkitc_1_n8r2 espressif_esp32s3_devkitc_1_n16r8 && \
sed -i 's/ESP32-S3-DevKitC-1-N8R2/ESP32-S3-DevKitC-1-N16R8/g' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.h && \
sed -i 's/ESP32-S3-DevKitC-1-N8R2/ESP32-S3-DevKitC-1-N16R8/g' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk && \
# CIRCUITPY_ESP_FLASH_MODE DIO -> QIO
sed -i 's/dio/qio/g' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk && \
# CIRCUITPY_ESP_FLASH_SIZE 8MB -> 16MB
sed -i 's/8MB/16MB/g' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk && \
echo 'CIRCUITPY_ESP32_CAMERA = 0' >> espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk && \
# QUAD -> OCTAL
sed -i 's/CONFIG_SPIRAM_MODE_QUAD/CONFIG_SPIRAM_MODE_OCT/g' espressif_esp32s3_devkitc_1_n16r8/sdkconfig && \
# 2MB -> 8MB
sed -i 's/2097152/8388608/g' espressif_esp32s3_devkitc_1_n16r8/sdkconfig
WORKDIR /root/circuitpython/ports/espressif
VOLUME ["/root/build"]
CMD ["/bin/bash", "-c", "source esp-idf/export.sh && make -j$(getconf _NPROCESSORS_ONLN) BOARD=espressif_esp32s3_devkitc_1_n16r8 && cp -r build-espressif_esp32s3_devkitc_1_n16r8/* /root/build"]
用法:
docker build . -t circuitpython
docker run -it --rm -v $(PWD)/build:/root/build circuitpython
烧录固件
esptool.py --port /dev/cu.SLAB_USBtoUART --chip esp32s3 --baud 921600 \
erase_flash && \
esptool.py --port /dev/cu.SLAB_USBtoUART --chip esp32s3 --baud 921600 \
--before=default_reset --after=hard_reset \
write_flash --flash_mode qio --flash_freq 80m --flash_size 16MB \
0x0 build/firmware.bin
你可以看到 USB 存储已经连接,并且 REPL 也可以正常工作。