【分享】使用SD卡烧写ESP32-Arduino中文社区 - Powered by Discuz! Archiver

n1001 发表于 2020-1-31 14:36

【分享】使用SD卡烧写ESP32

原理跟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共存,双管齐下摆脱数据线:lol

完整代码
#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() {}
顺便说下几个失败的解决办法(仅供参考):
1.连线正确了吗?
2.片选对了吗?
3.是否存在接触不良?
4.SD的文件系统对了吗?
5.SD卡本身品质怎样?

以上方法受个人知识限制,欢迎补充指正,谢谢大家的支持


页: [1]
查看完整版本: 【分享】使用SD卡烧写ESP32