更新於 2024.07.23

環境安裝

Espressif 官方的安裝指南 [原文] [中文]。

2024.07.23 發現 AI Chat 的資料來源是由 GitHub: espressif/esp-idf 構建,這可能是舊版的安裝方式。

安裝 ESP32 命令及工具鏈

安裝 Rust 環境見 310724 安裝 Rust 環境

安裝用於查看開發版硬體訊息及寫入開發版的工具:

cargo install cargo-espflash
# cargo install espflash
# 二者的差異感覺是 `alias espflash="cargo espflash"` 的別名關係。

安裝工具鏈:

cargo install espup ldproxy
 
espup install
source ~/export-esp.sh

espup install 會安裝 nightly 版本和 esp 工具鏈。

docker 映像文件

FROM archlinux:latest
 
ARG una=bwaycer
 
ENV PATH="$PATH:/home/$una/.cargo/bin"
 
RUN pacman-key --init && \
    pacman -Sy
 
RUN pacman -S --noconfirm \
        git python \
        base-devel
 
# `/dev/ttyUSB0` 的權限群組
RUN useradd -m -G uucp "$una"
 
USER "$una"
 
RUN sh <(curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs) \
        --default-toolchain nightly \
        --no-modify-path \
        -y
 
RUN cargo install cargo-espflash
RUN cargo install espup ldproxy
 
RUN espup install
# 相當於 `source export-esp.sh`
ENV LIBCLANG_PATH="/home/$una/.rustup/toolchains/esp/xtensa-esp32-elf-clang/esp-17.0.1_20240419/esp-clang/lib" \
    PATH="$PATH:/home/$una/.rustup/toolchains/esp/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bin"
 
ENV ESP_IDF_TOOLS_INSTALL_DIR="custom:/home/$una/.espressif"
    # 共用 ESP 專案透過 `cargo build` 所生成的 `.embuild/espressif/` 目錄
    #   https://github.com/esp-rs/esp-idf-sys/blob/master/BUILD-OPTIONS.md#esp_idf_tools_install_dir-esp_idf_tools_install_dir

閱讀更多:

使用方式

運行 docker 容器

docker run --rm -it \
  --device /dev/ttyUSB0 \
  local/rust-esp:latest bash

查看開發版硬體訊息

cargo espflash board-info --list-all-ports
# ✔ Use serial port '/dev/ttyUSB0'? (y/n) · yes
# [2024-07-24T03:48:52Z INFO ] Serial port: '/dev/ttyUSB0'
# [2024-07-24T03:48:52Z INFO ] Connecting...
# [2024-07-24T03:48:52Z INFO ] Using flash stub
# Chip type:         esp32 (revision v3.1)
# Crystal frequency: 40 MHz
# Flash size:        4MB
# Features:          WiFi, BT, Dual Core, 240MHz, Coding Scheme None
# MAC address:       a0:a3:b3:fd:ed:f8

寫入開發版

cargo espflash flash --monitor --list-all-ports
# ✔ Use serial port '/dev/ttyUSB0'? (y/n) · yes
# [2024-07-24T06:28:04Z INFO ] Serial port: '/dev/ttyUSB0'
# [2024-07-24T06:28:04Z INFO ] Connecting...
# [2024-07-24T06:28:04Z INFO ] Using flash stub
#     Finished `dev` profile [optimized + debuginfo] target(s) in 0.16s
# Chip type:         esp32 (revision v3.1)
# Crystal frequency: 40 MHz
# Flash size:        4MB
# Features:          WiFi, BT, Dual Core, 240MHz, Coding Scheme None
# MAC address:       a0:a3:b3:fd:ed:f8
# Bootloader:        /app/target/xtensa-esp32-espidf/debug/build/esp-idf-sys-fed6560e6519e72d/out/build/bootloader/bootloader.bin
# Partition table:   /app/target/xtensa-esp32-espidf/debug/build/esp-idf-sys-fed6560e6519e72d/out/build/partition_table/partition-table.bin
# App/part. size:    509,104/1,048,576 bytes, 48.55%
# [00:00:01] [========================================]      16/16      0x1000
# [2024-07-24T06:28:08Z INFO ] Segment at address '0x8000' has not changed, skipping write
# [00:00:25] [========================================]     258/258     0x10000
# [2024-07-24T06:28:35Z INFO ] Flashing has completed!
# Commands:
#     CTRL+R    Reset chip
#     CTRL+C    Exit
# ...

錯誤調試

error: failed to run custom build command for esp-idf-sys v0.35.0

第一次 build 專案時會發生,cargo clean 和修改程式碼後重構建不會發生,但移動目錄後再構建又會發生。

解決辦法是再運行一次就可以了!

cargo build
# ...
#    Compiling esp-idf-sys v0.35.0
#     Building [=======================> ] 202/210: esp-idf-sys(build)
# error: failed to run custom build command for `esp-idf-sys v0.35.0`
# ...
#   Using managed esp-idf repository: RemoteSdk { repo_url: None, git_ref: Tag("v5.2.2") }
#   Using esp-idf v5.2.2 at '/app/.embuild/espressif/esp-idf/v5.2.2'
#   Error: Failed to list cmake-file-api reply directory
#
#   Caused by:
#       No such file or directory (os error 2)
 
cargo build
#    Compiling esp-idf-sys v0.35.0
#    Compiling esp-idf-hal v0.44.0
#    Compiling esp-idf-svc v0.49.0
#    Compiling rustesp_bway v0.1.0 (/app)
#     Finished `dev` profile [optimized + debuginfo] target(s) in 1m 05s

docker 容器中無法自動選用 /dev/ttyUSB0 問題

使用

cargo espflash board-info --list-all-ports

替代

cargo espflash board-info