合宙ESP32C3 更换Flash/改QIO模式

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

合宙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飞线修改后的效果:
    在这里插入图片描述

在这里插入图片描述

    1. 去掉板子上的D4、D5 led灯珠,去掉R17、R18电阻。建议去掉电阻后,将电阻焊盘短接起来。(由于0402封装的焊盘位比较小,单独焊接一个焊点不好焊接。)或者只移除这2颗电阻,从板子边上排针焊盘IO12、IO13飞线到flash 引脚。
      在这里插入图片描述
    1. 将flash芯片的第三引脚和第七引脚翘起来。(注意翘的时候,不要用力过猛,容易折断,作者就在翘引脚时,废掉了一个引脚,后换了一颗flash芯片)
  • 3,通过跳线将对应的电阻焊盘位和flash引脚进行飞线连接。

📓更换Flash调整固件步骤

  1. 将ESP32C3项目clone到与LuatOS主仓库的同级目录。
    在这里插入图片描述

  2. 更新分区表文件: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);
}
  • 🧾串口打印
    在这里插入图片描述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值