ESP32工厂烧录方式记录
使用到的器件:ubuntu 20.04LTS
ESP32
树莓派4B 2020-05-28 版本
QT 5.11.3
CH340G
MM32F0133C6P
目标
由于公司最近研发出一个基于ESP32的IOT仪表,此项目有两个固件需要烧录,一个程序固件,一个是激活码固件,并且需要保存激活码与硬件的绑定关系,所以需要考虑flash芯片的烧录方式。基于此目的,需要设计出一个烧录工装,满足快速、批量、稳定这三个条件。
方案定义
flash使用的是w25Q64
,共计8MB,
- 可以使用ESP32进行烧录,但是速度不是很理想,按照CH340的最高波特率2M连接,烧录速度显示为500KB,实际测试需要20S。
- 可以自行设计一个flash烧录器,使用USB转SPI,进行烧录。速度未知
烧录工具链选择,一个是esptool,一个是USB接口。由于需要获取mac地址,所以esptool工具是一定需要的,主要分歧是在固件烧录部分,由于串口波特率的显示,直接使用esptool实在是太慢,要么更换串口芯片,要么就自行定义烧录方式,故而目前选择自行定义烧录方式。
工装主体选择:
- 离线方式,树莓派或者电脑等能够运行QT以及esptool的载体,外挂一个带流控制的串口,这里选择CH340,外挂一个带通信的flash烧录器。
- 在线方式,一个带无线方式通信的载体,需要带流控制的串口,带SPI功能,需要和主机进行通信,需要能够运行esptool,在线获取bin烧录文件,在线上传烧录信息。
总体流程:人工获取固件(共计4个,激活码,bootloader ,partition table,factory bin),打开QT软件,设置烧录信息,连接硬件(串口,spi flash ,电源),按键触发(外置),自动获取mac address
,烧录固件,绑定信息(csv),判断烧录结果。
树莓派等上位机记录
1. QT程序编译
理论是需要进行交叉编译,开发树莓派的QT应用才比较容易,但是实在是配置不了,此步骤暂停。
直接使用树莓派默认的QT软件包,使用VNC进行开发
2. ESP tool 工具安装
使用VScode进行esp32环境搭建,由于一直报错,不能搭建ESP32开发环境,但是工具还是下载下来了,使用python可以进行运行,其余问题无视。
3. QT运行外部脚本
使用Qprocess
进行开发1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
this->setWindowIcon(QIcon(":/res/debug.ico"));
ui->setupUi(this);
process = new QProcess(this);
process->start("bash"); //启动终端(Windows下改为cmd)
process->waitForStarted(); //等待启动完成
process->write("/home/kg/softwave/QT/test_bash.sh\n"); //向终端写入命令,注意尾部的“\n”不可省略
process->write("ifconfig\n");
connect(process , &QProcess::readyReadStandardOutput, this , &MainWindow::readoutput);
connect(process , &QProcess::readyReadStandardError, this , &MainWindow::readerror);
}
MainWindow::~MainWindow()
{
delete ui;
if(process)
{
process->close();
process->waitForFinished();
}
}
void MainWindow::readoutput()
{
ui->textEdit->append(process->readAllStandardOutput().data()); //将输出信息读取到编辑框
}
void MainWindow::readerror()
{
QMessageBox::information(0, "Error", process->readAllStandardError().data()); //弹出信息框提示错误信息
}
4. QT控制CH340进行程序烧录
esp tool 烧录命令./esp/esp-idf/components/esptool_py/esptool/esptool.py -p /dev/ttyUSB0 -b 2000000 write_flash 0x0 ~/softwave/bootloader.bin 0x8000 ~/softwave/partition-table.bin 0x10000 ~/softwave/TA100_app_20220610_V005.bin
烧录信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29esptool.py v3.3-dev
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP32-C3
Chip is ESP32-C3 (revision 3)
Features: Wi-Fi
Crystal is 40MHz
MAC: 7c:df:a1:d6:32:7c
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 2000000
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x00010000 to 0x000f7fff...
Compressed 15136 bytes to 10035...
Wrote 15136 bytes (10035 compressed) at 0x00000000 in 0.4 seconds (effective 285.2 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 149...
Wrote 3072 bytes (149 compressed) at 0x00008000 in 0.1 seconds (effective 306.5 kbit/s)...
Hash of data verified.
Compressed 946656 bytes to 556642...
Wrote 946656 bytes (556642 compressed) at 0x00010000 in 12.9 seconds (effective 588.4 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
可以看到烧录时间共计13.4S,但是实际使用秒表进行测量在20S。
下面使用QT 进行操作
5. QT控制USB进行烧录
抱歉,此处不进行代码展示
思路既为QT开启进程,运行控制台指令,进行程序下载
在整个过程中,可以先下载固件,将控制台的输出内容传输到QT的text view中,并解析是不是以Hard resetting via RTS pin...\n
结尾,如果是,就生成激活码文件,当然这个激活码文件需要自行申请并下载,然后让QT读取到内容,并按照指定格式生成单个激活码文件,最终下载到指定位置。