Программирование микроконтроллеров на Rust становится простым, как только вы один раз настроите окружение. В этом гиде мы с нуля подготовим инструменты, разберем код прошивки и заставим светиться встроенный светодиод на плашке ESP32.
1. Проверяем подключение платы#
Вставьте USB-кабель в плату ESP32 и убедитесь, что компьютер увидел серийный порт:
# На macOS:
ls /dev/cu.usbserial*
# На Linux:
ls /dev/ttyUSB*
2. Настраиваем окружение (2 способа)#
Выберите один из двух удобных способов сборки проекта:
Вариант А: Нативная установка через espup (Рекомендуется)#
Самый быстрый способ для Mac, Linux и Windows. Устанавливаем официальный тулчейн espup и прошивальщик espflash:
cargo install espup
cargo install espflash
espup installВариант Б: Изолированная сборка в Docker#
Если у вас установлен Docker и вы не хотите устанавливать тулчейны в систему, используйте официальный легкий образ Espressif под ESP32:
# Скачиваем образ с преднастроенным тулчейном Rust для ESP32
docker pull espressif/idf-rust:esp32_1.93.0.0
# Компилируем проект внутри Docker-контейнера
docker run --rm -v $PWD:/project -w /project espressif/idf-rust:esp32_1.93.0.0 cargo build3. Генерируем проект шаблона#
Для генерации готовой структуры проекта используем cargo-generate и официальный шаблон esp-rs:
cargo install cargo-generate
cargo generate esp-rs/esp-idf-template cargoВ появившемся интерактивном меню задаем параметры:
- Project Name:
esp32-blink - MCU:
esp32 - Advanced Options:
false
Утилита автоматически создаст структуру проекта с файлом конфигурации .cargo/config.toml:
[build]
target = "xtensa-esp32-none-elf"
[target.xtensa-esp32-none-elf]
runner = "espflash flash --monitor --chip esp32"4. Разбор кода (src/main.rs)#
Откройте сгенерированный файл src/main.rs. Программа на микроконтроллере отличается от обычной программы на ПК: здесь отключена библиотека std (#![no_std]) и стандартная точка входа C-runtime (#![no_main]).
Интерактивные слайды кода:#
Итоговый файл src/main.rs:#
#![no_std]
#![no_main]
use esp_hal::clock::CpuClock;
use esp_hal::delay::Delay;
use esp_hal::gpio::{Level, Output, OutputConfig};
use esp_hal::main;
use esp_println::println;
esp_bootloader_esp_idf::esp_app_desc!();
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
println!("PANIC: {:?}", info);
loop {}
}
#[main]
fn main() -> ! {
// 1. Получаем контроль над аппаратурой чипа
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
let peripherals = esp_hal::init(config);
let delay = Delay::new();
println!("==========================================");
println!("💡 ESP32 + Rust (Blink LED)");
println!("==========================================");
// 2. Настраиваем синий встроенный светодиод (GPIO 2)
let mut led = Output::new(peripherals.GPIO2, Level::Low, OutputConfig::default());
let mut count = 0;
// 3. Бесконечный цикл работы платы
loop {
count += 1;
led.toggle();
let state = if led.is_set_high() { "ВКЛ (HIGH 💡)" } else { "ВЫКЛ (LOW 🌑)" };
println!("[#{:03}] Светодиод: {}", count, state);
delay.delay_millis(1000);
}
}5. Прошиваем плату и смотрим результат#
Запустите сборку и прошивку одной командой:
cargo run --releaseИли вызовите espflash напрямую:
espflash flash target/xtensa-esp32-none-elf/release/esp32-blink --monitorУтилита сама определит подключенный порт (например, /dev/cu.usbserial-0001), скомпилирует проект, загрузит прошивку в флеш-память ESP32 и откроет серийный монитор логов во встроенном терминале VS Code:


А на самой плате ритмично замигает синий светодиод! 🎉
Проверьте свои знания#
Пройдите короткий квиз по материалу статьи:
Что дальше?#
В следующих статьях серии мы продолжим использовать эту настройку для работы с физическими кнопками, прерываниями, датчиками по I2C/SPI и Wi-Fi! 🦀


