原理跟OTA差不多,都是借助Update.h,只不过介质从网络变成了SD卡当然了,第一次也得用串口将包含该功能的程序烧录到芯片里
程序来源于“示例->Update->SD_Update”
示例中使用SD_MMC,但提到了支持SPI,所以我将其修改成使用SPI的SD卡
食用方法:
1.获取bin文件."项目->导出已编译的二进制文件"
2.重命名bin文件为"update.bin"
3.将"update.bin"放到SD卡的根目录
4.插入SD卡,重启ESP32后芯片会识别并启动Update
PS:可以和OTA共存,双管齐下摆脱数据线
完整代码
[mw_shl_code=arduino,true]#include <Update.h>
#include <FS.h>
#include <SD.h>
#define SD_CS 5 //SD卡片选引脚
//实现该功能的函数
void updateFromFS(fs::FS &fs) {
//打开文件
File updateBin = fs.open("/update.bin");
if (updateBin) { //打开文件成功
if (updateBin.isDirectory()) { //是目录
Serial.println("Error, update.bin is not a file");
updateBin.close();
return;
}
size_t updateSize = updateBin.size();
if (updateSize > 0) {
Serial.println("Try to start update");
Stream &updateSource = updateBin;
if (Update.begin(updateSize)) { //开始
//写入
size_t written = Update.writeStream(updateSource);
if (written == updateSize) {
Serial.println("Written : " + String(written) + " successfully");
}
else {
Serial.println("Written only : " + String(written) + "/" + String(updateSize) + ". Retry?");
}
if (Update.end()) { //结束
Serial.println("OTA done!");
if (Update.isFinished()) { //成功
Serial.println("Update successfully completed. Rebooting.");
}
else {
Serial.println("Update not finished? Something went wrong!");
}
}
else {
//输出错误
Serial.println("Error Occurred. Error #: " +String(Update.getError()));
}
}
else
{
Serial.println("Not enough space to begin OTA"); //空间不足
}
}
else {
Serial.println("Error, file is empty"); //文件是空的
}
updateBin.close();
fs.remove("/update.bin"); //删除文件
ESP.restart(); //重启
}
else {
Serial.println("Could not load update.bin from sd root");
}
}
void setup() {
uint8_t cardType;
Serial.begin(115200);
Serial.println("Welcome to the SD-Update example!");
//若初始化SD卡失败,则一直重启直至成功
if (!SD.begin(SD_CS)) {
Serial.println("Card Mount Failed");
delay(2000);
ESP.restart();
}
cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
delay(2000);
ESP.restart();
} else {
if (SD.exists("/update.bin")) { //若文件存在则执行
updateFromFS(SD);
}
}
}
void loop() {}[/mw_shl_code]
顺便说下几个失败的解决办法(仅供参考):
1.连线正确了吗?
2.片选对了吗?
3.是否存在接触不良?
4.SD的文件系统对了吗?
5.SD卡本身品质怎样?
以上方法受个人知识限制,欢迎补充指正,谢谢大家的支持
|