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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2848|回复: 0

【分享】使用SD卡烧写ESP32

[复制链接]
发表于 2020-1-31 14:36 | 显示全部楼层 |阅读模式
原理跟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卡本身品质怎样?

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


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:44 , Processed in 0.069833 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表