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进行开发:
- 首先创建一个新项目:
cargo new esp32-example --bin
cd esp32-example
- 添加必要的依赖到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 } # 烧录工具
- 配置.cargo/config.toml:
[target.'cfg(target_arch = "xtensa")']
runner = "espflash flash --monitor /dev/ttyUSB0"
[build]
target = "xtensa-esp32-espidf" # ESP32目标架构
- 创建一个简单的闪烁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);
}
}
- 编译并烧录程序:
cargo build --release
cargo run --release
注意事项
-
Linux系统需要将用户添加到
dialout
组以获得串口访问权限:sudo usermod -a -G dialout $USER
-
WSL1不支持espflash,WSL2仅支持通过UART烧录。
-
支持两种日志格式:
serial
: 默认串口日志格式defmt
: 使用defmt日志框架
espflash提供了高效稳定的嵌入式设备固件烧录功能,是Rust开发Espressif设备的理想工具。
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
即可编译并烧录固件。
常见问题解决
-
权限问题: Linux/Mac下可能需要将用户加入dialout组:
sudo usermod -a -G dialout $USER
-
设备未识别: 确保已安装正确的USB转串口驱动
-
烧录失败: 尝试降低波特率(如115200)或按住BOOT按钮进入下载模式
完整示例
下面是一个完整的espflash使用示例,展示如何从零开始构建并烧录一个ESP32项目:
- 首先创建一个新的Rust项目:
cargo new esp32-example
cd esp32-example
- 添加必要的依赖到
Cargo.toml
:
[target.'cfg(any(target_arch = "xtensa"))']
runner = "espflash flash --monitor /dev/ttyUSB0"
[dependencies]
esp-idf-sys = { version = "0.33", features = ["esp32"] }
- 创建
.cargo/config.toml
配置文件:
[target.xtensa-esp32-espidf]
runner = "espflash flash --monitor /dev/ttyUSB0"
[build]
target = "xtensa-esp32-espidf"
- 编写主程序
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); }
}
}
- 编译并烧录程序:
cargo build
cargo run
- 监视串口输出:
espflash monitor /dev/ttyUSB0
这个完整示例展示了如何:
- 创建一个新的ESP32项目
- 配置必要的构建目标
- 编写简单的Rust程序
- 使用espflash进行一键烧录
- 监视设备输出
建议在Linux/macOS系统上使用,Windows用户可能需要额外安装USB转串口驱动。