Rust ESP32/ESP8266烧录工具espflash的使用,espflash提供高效稳定的嵌入式设备固件刷写功能

Rust ESP32/ESP8266烧录工具espflash的使用

espflash是一个用于烧录Espressif设备的Rust库和命令行工具,支持ESP32、ESP32-C2/C3/C5/C6、ESP32-H2、ESP32-P4和ESP32-S2/S3等芯片。

安装

从源码安装(使用cargo install)需要系统上安装rustc>=1.85.0:

cargo install espflash --locked

或者使用cargo-binstall下载预编译版本:

cargo binstall espflash

基本使用

espflash提供多个子命令:

Usage: espflash [OPTIONS] <COMMAND>

Commands:
  board-info       打印连接设备的信息
  checksum-md5     计算指定区域的MD5校验和
  completions      为指定shell生成补全脚本
  erase-flash      完全擦除闪存
  erase-parts      擦除指定分区
  erase-region     擦除指定区域
  flash            将ELF格式的应用烧录到连接的设备
  hold-in-reset    保持目标设备在复位状态
  list-ports       列出可用串口
  monitor          打开串口监视器而不烧录设备
  partition-table  在CSV和二进制格式间转换分区表
  read-flash       读取SPI闪存内容
  reset            复位目标设备
  save-image       生成二进制应用镜像并保存到本地
  write-bin        将二进制文件写入设备闪存的指定地址
  help             打印帮助信息

完整示例

1. 作为Cargo Runner使用

在项目.cargo/config.toml中添加:

[target.'cfg(any(target_arch = "riscv32", target_arch = "xtensa"))']
runner = "espflash flash --baud=921600 --monitor /dev/ttyUSB0"

2. 作为库使用

在Cargo.toml中添加依赖:

espflash = { version = "3.3", default-features = false }

或者运行:

cargo add espflash --no-default-features

3. 烧录固件示例

# 烧录ELF文件并打开串口监视器
espflash flash --monitor target/riscv32imc-unknown-none-elf/release/your_app

# 擦除整个闪存
espflash erase-flash

# 读取闪存内容
espflash read-flash 0x0 0x100000 flash_contents.bin

4. 配置文件示例

espflash_ports.toml(端口配置):

[connection]
serial = "/dev/ttyUSB0"

# 或者通过USB VID/PID
[[usb_device]]
vid = "303a"
pid = "1001"

espflash.toml(项目配置):

baudrate = 460800
bootloader = "path/to/custom/bootloader.bin"
partition_table = "path/to/custom/partition-table.bin"

[flash]
mode = "qio"
size = "8MB"
frequency = "80MHz"

完整示例demo

下面是一个完整的ESP32开发项目示例,展示如何使用espflash进行开发:

  1. 首先创建一个新项目:
cargo new esp32-example --bin
cd esp32-example
  1. 添加必要的依赖到Cargo.toml:
[package]
name = "esp32-example"
version = "0.1.0"
edition = "2021"

[dependencies]
esp32-hal = "0.10.0"  # ESP32硬件抽象层
espflash = { version = "3.3", default-features = false }  # 烧录工具
  1. 配置.cargo/config.toml:
[target.'cfg(target_arch = "xtensa")']
runner = "espflash flash --monitor /dev/ttyUSB0"

[build]
target = "xtensa-esp32-espidf"  # ESP32目标架构
  1. 创建一个简单的闪烁LED程序src/main.rs:
// 导入必要的库
use esp32_hal::{
    clock_control::ClockControl, 
    gpio::IO,
    peripherals::Peripherals,
    prelude::*,
    timer::TimerGroup,
    Delay,
};

// 主函数
fn main() -> ! {
    // 获取外围设备
    let peripherals = Peripherals::take();
    let mut system = peripherals.DPORT.split();
    
    // 初始化时钟控制
    let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
    
    // 设置GPIO
    let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
    let mut led = io.pins.gpio2.into_push_pull_output();
    
    // 创建延时实例
    let mut delay = Delay::new(&clocks);
    
    // 主循环 - 闪烁LED
    loop {
        led.set_high().unwrap();
        delay.delay_ms(1000u32);
        led.set_low().unwrap();
        delay.delay_ms(1000u32);
    }
}
  1. 编译并烧录程序:
cargo build --release
cargo run --release

注意事项

  1. Linux系统需要将用户添加到dialout组以获得串口访问权限:

    sudo usermod -a -G dialout $USER
    
  2. WSL1不支持espflash,WSL2仅支持通过UART烧录。

  3. 支持两种日志格式:

    • serial: 默认串口日志格式
    • defmt: 使用defmt日志框架

espflash提供了高效稳定的嵌入式设备固件烧录功能,是Rust开发Espressif设备的理想工具。


1 回复

Rust ESP32/ESP8266烧录工具espflash的使用指南

简介

espflash是一个用Rust编写的ESP32和ESP8266微控制器固件烧录工具,提供了高效稳定的嵌入式设备固件刷写功能。它支持通过串口(USB)连接ESP设备进行固件烧录,是替代esptool.py的Rust实现方案。

主要特性

  • 跨平台支持(Windows/Linux/macOS)
  • 无需Python环境
  • 更快的烧录速度
  • 更小的二进制体积
  • 支持ELF文件直接烧录
  • 支持分区表操作

安装方法

通过cargo安装

cargo install espflash

预编译二进制

可以从GitHub发布页面下载预编译的二进制文件。

基本使用方法

1. 查看已连接设备

espflash board-info

2. 烧录固件

基本烧录命令格式:

espflash flash <串口设备> <固件文件>

示例(烧录ESP32):

espflash flash /dev/ttyUSB0 firmware.bin

3. 指定烧录地址

espflash flash --address 0x10000 /dev/ttyUSB0 firmware.bin

4. 设置波特率

espflash flash --baud 921600 /dev/ttyUSB0 firmware.bin

5. 烧录ELF文件

espflash可以直接烧录ELF格式文件,无需先转换为bin文件:

espflash flash /dev/ttyUSB0 target/xtensa-esp32-espidf/debug/your-app

高级功能

1. 分区表操作

查看分区表:

espflash partition-table /dev/ttyUSB0

烧录分区表:

espflash flash --partition-table partitions.csv /dev/ttyUSB0 firmware.bin

2. 监视串口输出

espflash monitor /dev/ttyUSB0

3. 擦除Flash

espflash erase-flash /dev/ttyUSB0

与cargo集成

可以在Cargo项目中配置.cargo/config.toml文件,实现一键烧录:

[target.xtensa-esp32-espidf]
runner = "espflash flash --monitor /dev/ttyUSB0"

然后使用cargo run即可编译并烧录固件。

常见问题解决

  1. 权限问题: Linux/Mac下可能需要将用户加入dialout组:

    sudo usermod -a -G dialout $USER
    
  2. 设备未识别: 确保已安装正确的USB转串口驱动

  3. 烧录失败: 尝试降低波特率(如115200)或按住BOOT按钮进入下载模式

完整示例

下面是一个完整的espflash使用示例,展示如何从零开始构建并烧录一个ESP32项目:

  1. 首先创建一个新的Rust项目:
cargo new esp32-example
cd esp32-example
  1. 添加必要的依赖到Cargo.toml
[target.'cfg(any(target_arch = "xtensa"))']
runner = "espflash flash --monitor /dev/ttyUSB0"

[dependencies]
esp-idf-sys = { version = "0.33", features = ["esp32"] }
  1. 创建.cargo/config.toml配置文件:
[target.xtensa-esp32-espidf]
runner = "espflash flash --monitor /dev/ttyUSB0"

[build]
target = "xtensa-esp32-espidf"
  1. 编写主程序src/main.rs
// 引入必要的库
use esp_idf_sys as _;

fn main() {
    // 初始化ESP32芯片
    unsafe { esp_idf_sys::esp_idf_sys_init(); }
    
    // 打印欢迎信息
    println!("Hello from ESP32!");
    
    // 主循环
    loop {
        println!("Running...");
        unsafe { esp_idf_sys::vTaskDelay(1000 / esp_idf_sys::portTICK_PERIOD_MS); }
    }
}
  1. 编译并烧录程序:
cargo build
cargo run
  1. 监视串口输出:
espflash monitor /dev/ttyUSB0

这个完整示例展示了如何:

  • 创建一个新的ESP32项目
  • 配置必要的构建目标
  • 编写简单的Rust程序
  • 使用espflash进行一键烧录
  • 监视设备输出

建议在Linux/macOS系统上使用,Windows用户可能需要额外安装USB转串口驱动。

回到顶部