背景
前段时间用MicroPython开发了一个项目,硬件是ESP32-C3,目前准备量产,我需要提供固件以供加工厂批量烧录,需要把我有程序的板子里的程序读出来,然后下到别的板子上,以下做这件事情的过程记录。
1.固件读取烧录
在准备ESP32-C3硬件的量产过程中,将MicroPython程序固化到设备中,有以下步骤:
1.读出固件:
对于已经烧录到某个ESP32-C3板子上的固件,要读出并复制到其他板子上,可以使用esptool.py或其他串行通信工具来做这个工作。以下是使用esptool.py读取固件的一个基本示例:
esptool.py --chip esp32c3 --port /dev/ttyUSB0 read_flash 0x10000 0x100000 firmware.bin
--chip esp32c3
指定了芯片类型;
--port /dev/ttyUSB0
指定了ESP32-C3连接到计算机的串行端口;
read_flash
是要执行的操作,0x10000
是开始读取的起始地址,0x100000
是要读取的长度(这个长度需要您根据实际的固件大小来决定);
firmware.bin
是读取的内容保存到的文件;
2.烧录到新的ESP32-C3板子:
在获取了固件镜像文件后,您可以使用esptool.py将这个镜像烧录到新的ESP32-C3板子上。烧录命令类似于:
esptool.py --chip esp32c3 --port /dev/ttyUSB0 write_flash 0x10000 firmware.bin
在这里,write_flash
是烧录操作,0x10000
是烧录的起始地址,firmware.bin
是固件文件。
2.烧录图形界面
接下来,要用PysimpleGUI来做个烧录界面,包含串口设置,文件选择,擦除和烧录的按钮,用于执行以上的烧录代码。
要使用 PySimpleGUI 创建一个图形界面,用于设置串口,选择文件以及执行擦除和烧录操作,可以参考下面的代码示例。这个示例提供了一个基本的界面框架,并使用了 esptool.py
的命令行操作。
要用到 PySimpleGUI 和 pyserial 库。如果没有安装,可以使用 pip 进行安装:
pip install PySimpleGUI pyserial
接下来是代码示例:
import os
try:import PySimpleGUI as sgimport serial
except:os.system('pip install PySimpleGUI pyserial')import PySimpleGUI as sgimport serial
import subprocess
from serial.tools import list_ports # 修正导入# 获取系统中的串口列表
def get_serial_ports():ports = list_ports.comports() # 修正使用list_portsreturn [port.device for port in ports]# 获取系统中的串口列表
def get_serial_ports():ports = list_ports.comports() # 修正使用list_portsreturn [port.device for port in ports]# 执行esptool的命令
def run_esptool_cmd(cmd):try:process = subprocess.run(cmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)return process.stdout.decode()except subprocess.CalledProcessError as e:return e.stderr.decode()# GUI Layout
layout = [[sg.Text('串口:'), sg.Combo(get_serial_ports(), size=(10, 1), key='PORT'), sg.Button('刷新串口')],[sg.Text('固件文件:'), sg.Input("./firmware.bin",size=(25, 1), key='FIRMWARE'), sg.FileBrowse('浏览')],[sg.Button('读取'), sg.Button('擦除'), sg.Button('烧录')],[sg.Output(size=(60, 5))]
]# Create the window
window = sg.Window('ESP32-C3 烧录工具', layout)# Event Loop
while True:event, values = window.read()if event == sg.WIN_CLOSED:breakelif event == '刷新串口':window['PORT'].update(values=get_serial_ports())elif event == '擦除':if values['PORT']:cmd = f'esptool.py --chip esp32c3 --port {values["PORT"]} erase_flash'print("发送擦除指令"+cmd+run_esptool_cmd(cmd)我想用PYSIMPLEGUI来做个烧录界面,包含串口设置,文件选择,擦除和烧录的按钮,用于执行以上的烧录代码,请给出代码示例)else:print("请先选择一个串口")elif event == '读取':if values['PORT'] and values['FIRMWARE']:cmd = f'esptool.py --chip esp32c3 --port {values["PORT"]} read_flash 0x10000 0x100000 {values["FIRMWARE"]}'print("读取返回"+cmd+run_esptool_cmd(cmd))else:print("请先选择一个串口和文件保存路径")elif event == '烧录':if values['PORT'] and values['FIRMWARE'] and os.path.exists(values['FIRMWARE']):firmware_path = values['FIRMWARE']cmd = f'esptool.py --chip esp32c3 --port {values["PORT"]} write_flash 0x10000 "{firmware_path}"'print("发送烧录指令"+cmd+run_esptool_cmd(cmd))else:print("请确保选择了串口和固件文件,并且固件文件路径正确")# Close the window
window.close()
代码说明:
-
list_ports.comports()
函数用来获取当前系统上可用的串口。 -
run_esptool_cmd
函数用来执行esptool.py
的相关命令并捕捉输出。 -
界面布局定义了串口选择、文件选择和操作按钮。
-
事件循环在接收到事件时执行相关操作,比如刷新串口列表,执行擦除和烧录操作。
如果有任何疑问,可以微信联系我,全网同名。