合宙ESP32C3 更换Flash调整lua固件教程分享
- 📌合宙官方的固件编译指南:
https://wiki.luatos.com/develop/compile/ESP32C3.html - 🎈合宙给出的更换flash的文档说明:
https://wiki.luatos.com/chips/esp32c3/change_flash.html?highlight=flash - 合宙ESP32C3原理图:
https://cdn.openluat-luatcommunity.openluat.com/attachment/CORE-ESP32-C3%E8%AE%BE%E8%AE%A1%E5%8E%9F%E7%90%86%E5%9B%BE_V1.2.pdf
- ✨我主要来补充一下在成功编译之路上的坑坑洼洼,官方的教程有讲的就一比带过,或划重点说明。
- 🎉根据原理图来看,如果追求更快的spi flash 访问速度,可以将2线的DIO flash模式改为4线的QIO模式,需要占用GPIO12 GPIO13引脚,断开板子上的D4、D5上的led引脚。
- 🌿原DIO连线方式:

- 🌿flash QIO连线方式:

- ESP32C3 SPI 引脚

- 合宙esp32c3开发板GPIO12、GPIO13引脚的led:

📗关于ESP32在Dual SPI模式和Quad SPI模式运行速度问题说明
- 详见:
https://docs.espressif.com/projects/esptool/en/latest/esp32c3/advanced-topics/spi-flash-modes.html#spi-flash-modes
- 核心机制:
- ESP32采用"XiP"(eXecute in Place)架构,代码直接从Flash执行,但通过透明缓存机制加速。
- 只有当发生缓存未命中(cache miss)时,才会从Flash重新读取数据。
- 速度差异的本质:
- Quad SPI相比Dual SPI的主要优势在于缓存填充速度:
Quad SPI每个时钟周期传输4位数据.
Dual SPI每个时钟周期传输2位数据.
实际代码执行速度取决于缓存命中率,只有在频繁缓存未命中的情况下才会显著影响性能.
- 有关SPI传输带宽计算公式:
有效带宽 = SPI时钟频率 × 数据线数量
80MHz Dual SPI:80MHz × 2 = 160Mbps
40MHz Quad SPI:40MHz × 4 = 160Mbps(理论带宽相同)
- ✨优化建议:
优先提高SPI时钟频率(需稳定性测试)
通过以下方式减少缓存未命中:
优化代码局部性(集中访问内存区域)
使用IRAM_ATTR将关键函数放在内部RAM
调整编译器优化选项(-Os/-O2)
对于数据密集型应用,考虑使用PSRAM(如有)
🛠改QIO模式
- ✨根据上面的原理图,通过飞线翘引脚飞线该QIO模式。如果没有这样的特殊需求的话,就不要自己轻易去改,对于焊接新手不友好,而且容易在翘flash引脚时,将引脚翘断,报废芯片。
- qio或qout模式的支持条件:
- ESP32与片外flash 引脚连接,需要符合…
- 片外flash 状态寄存器2的QE位需要使能。(华邦W25Q128JVSIQ默认QE位使能,支持直接更换后就可以烧录使用。对于像GD25Wxx系列,默认就没有开启使能QE位。)
- 🌿通过esptool修改状态寄存器某位。
esptool --port COM40 read_flash_status查询状态寄存器(默认查询1-2):
C:\Users\Administrator>esptool --port COM40 read_flash_status
esptool.py v4.8.1
Serial port COM40
Connecting...
Detecting chip type... ESP32-C3
Chip is ESP32-C3 (QFN32) (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 60:55:f9:7e:77:70
Uploading stub...
Running stub...
Stub running...
Status value: 0x0200
Hard resetting via RTS pin...
/***读取3个状态寄存器数据操作***/
C:\Users\Administrator>esptool --port COM40 read_flash_status --bytes 3
esptool.py v4.8.1
Serial port COM40
Connecting...
Detecting chip type... ESP32-C3
Chip is ESP32-C3 (QFN32) (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 60:55:f9:7e:77:70
Uploading stub...
Running stub...
Stub running...
Status value: 0x400200
Hard resetting via RTS pin...
- 修改2个状态寄存器命令:
esptool --port COM9 write_flash_status --non-volatile --bytes 2 0x0200- 修改3个状态寄存器命令:
esptool --port COM9 write_flash_status --non-volatile --bytes 3 0x000200
个人在使用esptool修改flash状态寄存器测试发现,通过一次性修改3个状态寄存器才能实现对状态寄存器3进行修改成功。对于状态寄存器2和3没有修改成功过,(默认使能状态下,使用命令改变不了该位的状态。)
- 当设备处于QPI模式时,QE位将保持在1。QPI模式下的“写入状态寄存器”命令无法将QE位从“1”更改为“0”。
- 合宙esp32c3 flash4线SPI飞线修改后的效果:


-
- 去掉板子上的D4、D5 led灯珠,去掉R17、R18电阻。建议去掉电阻后,将电阻焊盘短接起来。(由于0402封装的焊盘位比较小,单独焊接一个焊点不好焊接。)或者只移除这2颗电阻,从板子边上排针焊盘IO12、IO13飞线到flash 引脚。

- 去掉板子上的D4、D5 led灯珠,去掉R17、R18电阻。建议去掉电阻后,将电阻焊盘短接起来。(由于0402封装的焊盘位比较小,单独焊接一个焊点不好焊接。)或者只移除这2颗电阻,从板子边上排针焊盘IO12、IO13飞线到flash 引脚。
-
- 将flash芯片的第三引脚和第七引脚翘起来。(注意翘的时候,不要用力过猛,容易折断,作者就在翘引脚时,废掉了一个引脚,后换了一颗flash芯片)
-
3,通过跳线将对应的电阻焊盘位和flash引脚进行飞线连接。
📓更换Flash调整固件步骤
-
将ESP32C3项目clone到与LuatOS主仓库的同级目录。

-
更新分区表文件:
partitions.csv
默认项目下面有3个分区表配置文件,分别是默认的4MB,另外的8MB、16MB。根据个人更换flash大小,选择对应的分区表文件。8MB和16MB的分区表文件改成默认的原来4MB的分区表文件名
partitions.csv
我这里将16MB的改成默认的partitions.csv文件后的内容是这样的。你不需要修改文件内容,安装官方给出的教程是:只需将原来的默认的4MB的partitions.csv文件移走或删除,然后根据自己实际更换的flash容量重命名对应的容量分区表名字即可。实际上是需要安装原来4MB的分区表配置文件来调整现有的8MB或16MB的分区表配置文件的。
16MB修改分区表配置前的内容:

- 修改后的
16MB的分区表内容:

- 如果不按照上面的分区表修改,将会导致最后生成的Soc文件无法上传
Lua脚本。

-
修改
Soc_tools文件夹下的json文件内容

-
打开ESP-IDF命令提示符窗口

-
通过菜单命令定位到项目文件夹;
cd C:\Users\Administrator\Desktop\Luat_project\LuatOS-ESP32

-
设置esp32型号:
idf.py set-target esp32c3

-
调用
idf.py menuconfig修改flash配置文件信息

-
通过键盘方向键移到“
Serial flasher config”回车进入

-
移动到
flash size选项,根据自己更换的flash大小选择8MB或者16MB


-
然后按
s进行保存,弹出的对话框回车确认


-
按
Q键退出设置窗口,回到命令提示符窗口

- 接下来执行
idf.py build编译项目
由于编译实在太长了,我就不在这里重复演示放图了。
- 编译完成的信息如下:

打包生成Soc文件
- 继续接着上面编译完成的命令提示符窗口,输入
cd tools,定位到C:\Users\Administrator\Desktop\Luat_project\LuatOS-ESP32\tools这个文件夹下
- 执行"pip install -r .\requirements.txt"命令:用来安装所需打打包插件。

- 打包生成
Soc烧录文件程序“python .\esp32v3.py -t esp32c3 -p”命令

到这里已经大功告成!
⛳分享16MB的打包好的Soc文件
包含2个:一个是标准版的,一个带USB调试输出的
链接:https://pan.baidu.com/s/1n5nQnhcnsyP00fk-j3vFXg
提取码:prr8
⛳合宙ESP32C3开发板注意事项
- 🌿外置的SPI flash是采用2线 DIO模式的,在开发使用时,注意这一点。在基于Arduino开发环境下使用,需要将flash模式设置为DIO模式,否则烧录后无限重启,在基于VSCode Platform IO环境下开发选择
airm2m_core_esp32c3型号,或者自定义个开发板类型的json文件到固件目录下,也可以在现有的C3型号的.json文件中修改对应的C3 flash模式。 - 🔖VSCode Platform IO环境下路径:
C:\Users\Administrator\.platformio\platforms\espressif32\boards
📝使用Arduino IDE烧录程序测试
- 🛠参数设置:

void setup() {
Serial.begin(115200);
Serial.println("Hello ESP32C3!!");
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
delay(1000);
Serial.printf("getChipRevision= %s \n",ESP.getChipModel()); //ESP32-C3
Serial.printf("getChipCores= %d Core\n",ESP.getChipCores()); // 1
Serial.printf("getCpuFreqMHz= %d MHz\n",ESP.getCpuFreqMHz()); //160
Serial.printf("getSketchSize= %d bytes\n",ESP.getSketchSize());//246144 bytes
Serial.printf("getFreeSketchSpace= %d bytes\n",ESP.getFreeSketchSpace());
uint32_t flash_Size = ESP.getFlashChipSize();
Serial.printf("getFlashChipSize= %d \n",flash_Size); //16777216
Serial.printf("getFlashChipSpeed= %d \n",ESP.getFlashChipSpeed());//80000000
FlashMode_t flash_Mode = ESP.getFlashChipMode();
Serial.printf("Flash mode: %s\n", (flash_Mode == FM_QIO ? "QIO" : flash_Mode == FM_QOUT ? "QOUT" : flash_Mode == FM_DIO ? "DIO" : flash_Mode == FM_DOUT ? "DOUT" : "UNKNOWN"));
delay(1000);
}
- 🧾串口打印


本文分享合宙ESP32C3更换Flash调整lua固件教程。介绍将DIO flash模式改为QIO模式的方法,涉及引脚连接改动。说明了Dual SPI和Quad SPI模式运行速度差异,还给出优化建议。详细阐述更换Flash调整固件步骤、打包生成文件方法,分享16MB打包好的Soc文件,最后提及开发板注意事项及Arduino IDE烧录测试。





1万+

被折叠的 条评论
为什么被折叠?



