6 releases (breaking)

0.7.0 Feb 21, 2023
0.5.0 Jan 26, 2023
0.4.0 Dec 12, 2022
0.3.0 Nov 17, 2022
0.1.0 Aug 25, 2022

#52 in Embedded development

Download history 163/week @ 2022-11-29 214/week @ 2022-12-06 422/week @ 2022-12-13 144/week @ 2022-12-20 173/week @ 2022-12-27 183/week @ 2023-01-03 353/week @ 2023-01-10 169/week @ 2023-01-17 315/week @ 2023-01-24 560/week @ 2023-01-31 330/week @ 2023-02-07 340/week @ 2023-02-14 503/week @ 2023-02-21 270/week @ 2023-02-28 312/week @ 2023-03-07 261/week @ 2023-03-14

1,406 downloads per month
Used in esp-storage


23K SLoC


Crates.io docs.rs Crates.io Matrix

no_std HAL for the ESP32-C3 from Espressif. Implements a number of the traits defined by embedded-hal.

This device uses the RISC-V ISA, which is officially supported by the Rust compiler via the riscv32imc-unknown-none-elf target. Refer to the Getting Stared section below for more information.


Getting Started

Installing the Rust Compiler Target

The compilation target for this device is officially supported via the stable release channel and can be installed via rustup:

$ rustup target add riscv32imc-unknown-none-elf

Supported boot methods

IDF Bootloader

The IDF second stage bootloader is the default bootloader solution.

By default, espflash fetches the required binaries (Bootloader and Partition Table) and flashes them onto the target device together with the Rust-based application firmware image.

MCUboot Secure Bootloader

MCUboot is a secure bootloader solution feature-wise equivalent to the IDF Bootloader. You may find more information on the documentation pages for MCUboot and the Espressif port:


Booting from MCUboot secure bootloader requires the Rust application image to be built in a MCUboot-specific image format. You need to install the following dependencies:

# Required for generating the object file in Intel HEX format
cargo install cargo-binutils
rustup component add llvm-tools-preview

# MCUboot's tool for image signing and key management
pip install imgtool

Currently, MCUboot is still not supported as a booting option in espflash, so you'll need to use the esptool utility for flashing both the MCUboot bootloader and the Rust application binaries:

# Serial flasher utility for Espressif chips
pip install esptool

Download a prebuilt MCUboot bootloader image for the target device:

# Prebuilt MCUboot bootloader binary
curl -LO https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/mcuboot-esp32c3.bin
Booting the Hello World example from MCUboot

Build the Hello World example with MCUboot support:

cargo build --release --example hello_world --features mcu-boot

Then proceed to generating the application binary and flashing it onto the target device:

# Generate the object file in Intel HEX format
rust-objcopy -O ihex target/riscv32imc-unknown-none-elf/release/examples/hello_world app.hex

# Generate the application firmware image binary file in MCUboot-format
imgtool sign --pad --align 4 -v 0 -s auto -H 32 --pad-header -S 0x100000 app.hex app.bin

# Flash the application firmware image binary onto the target device
esptool.py -c esp32c3 -p /dev/ttyUSB0 -b 921600 --after no_reset write_flash -fs 4MB -fm dio -ff 40m 0x0 ./mcuboot-esp32c3.bin 0x110000 ./app.bin

Once the device is flashed, you may monitor the serial interface (e.g. with picocom):

picocom -b 115200 /dev/ttyUSB0 --imap lfcrlf

Reset the board and MCUboot should load the Hello World example:

Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
mode:DIO, clock div:2
entry 0x403c804a
[esp32c3] [INF] Enabling RNG early entropy source...
[esp32c3] [INF] *** Booting MCUboot build v1.8.0-86-g14763b1 ***
[esp32c3] [INF] Primary image: magic=good, swap_type=0x2, copy_done=0x1, image_ok=0x3
[esp32c3] [INF] Scratch: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
[esp32c3] [INF] Boot source: none
[esp32c3] [INF] Swap type: test
[esp32c3] [INF] Disabling RNG early entropy source...
[esp32c3] [INF] br_image_off = 0x10000
[esp32c3] [INF] ih_hdr_size = 0x20
[esp32c3] [INF] DRAM segment: start=0x3fcd0000, size=0x0, vaddr=0x3fcd0000
[esp32c3] [INF] IRAM segment: start=0x1d00, size=0x170c, vaddr=0x40380000
[esp32c3] [INF] start=0x40380004
Hello world!
Hello world!
Hello world!

Direct Boot

Direct Boot allows an application stored in the External Flash to be executed directly, without being copied into Internal RAM.

Booting the Hello World example using Direct Boot

Build the Hello World example with support for Direct Boot:

cargo build --release --example hello_world --features direct-boot

Then proceed to generating the application binary and flashing it onto the target device:

cargo espflash --release --format direct-boot --features direct-boot --example hello_world --monitor

The ROM Bootloader will identify the firmware image built with Direct Boot support and load it appropriately from the External Flash:

Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
Hello world!
Hello world!
Hello world!


Licensed under either of:

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


~203K SLoC