Blinky with Rust on ESP32-C3

Updated on 19 October 2023
dev board ESP32-C3-DevKitM-1
chip ESP32-C3-MINI-1-N4
features rust blinky esp32c3 riscv

Before starting


Ensure the following dependancies are downloaded and available:

Buy the components


Download code src/
use esp_idf_hal::{delay::FreeRtos, gpio::PinDriver, peripherals::Peripherals};
use esp_idf_sys as _;

fn main() {

    let peripherals = Peripherals::take().unwrap();
    let mut led_pin = PinDriver::output(peripherals.pins.gpio3).unwrap();

    loop {




.PHONY: default compile upload log clean

default: clean compile upload

help: ## Show help message
	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

compile: ## Compile rust
	cargo clean
	cargo build

upload: ## Upload the firmware to the board
	espflash flash target/riscv32imc-esp-espidf/debug/$(PROJECT_NAME)

log: ## Start the logs
	cargo espmonitor $(PORT) --chip esp32c3

clean: ## Remove all build files
	cargo clean


A photo of the actual setup.

Blinky with Rust on ESP32-C3 prototype


Wire up the hardware accordingly

Blinky with Rust on ESP32-C3 schematic

Serial console

Serial output from the firmware.

Blinky with Rust on ESP32-C3 serial console


Install dependancies

  1. Install for RISC-V
     rustup target add riscv32imc-unknown-none-elf
  2. Install Cargo sub-commands
     cargo install cargo-generate
     cargo install ldproxy
     cargo install espup
     cargo install espflash
     cargo install cargo-espmonitor
     cargo install --list
  3. Generate the project
     cargo generate esp-rs/esp-idf-template cargo

    With options:

    • project-name: blinky-rust-esp32c3
    • MCU target: esp32c3
    • Configure advanced template options: false

    Typical output:

     $  cargo generate esp-rs/esp-idf-template cargo
     ⚠️   Favorite `esp-rs/esp-idf-template` not found in config, using it as a git repository:
     🤷   Project Name: blinky-rust-esp32c3
     🔧   Destination: /Users/sayanee/Desktop/blinky-rust-esp32c3 ...
     🔧   project-name: blinky-rust-esp32c3 ...
     🔧   Generating template ...
     ✔ 🤷   Which MCU to target? · esp32c3
     ✔ 🤷   Configure advanced template options? · false
     🔧   Moving generated files into: `/Users/sayanee/Desktop/blinky-rust-esp32c3`...
     🔧   Initializing a fresh Git repository
     ✨   Done! New project created /Users/sayanee/Desktop/blinky-rust-esp32c3


  1. Change directory into the project name
      $ cd blinky
  2. Edit file src/ with the blinky code.
  3. Edit Cargo.toml to add dependencies
name = "blinky-rust-esp32c3"
version = "0.1.0"
authors = ["Sayanee <[email protected]>"]
edition = "2021"
resolver = "2"
rust-version = "1.66"

opt-level = "s"

debug = true
opt-level = "z"

pio = ["esp-idf-sys/pio"]

esp-idf-sys = { version = "0.33.2", features = ["binstart"] }
esp-idf-hal = "0.42"

embuild = "0.31.3"
  1. Compile / build the project
      $ cargo build

Upload the firmware

  1. Plug in the board into the USB port.
  2. Check the port address

     $ ls /dev/cu.*
  3. Upload / Flash
      espflash flash target/riscv32imc-esp-espidf/debug/blinky

View the logs

Start the serial monitor

  cargo espmonitor /dev/cu.usbserial-1410 --chip esp32c3