查看: 1061|回复: 0

【分享】使用SD卡烧写ESP32

[复制链接]
  • TA的每日心情
    开心
    2020-8-24 21:27
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    发表于 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卡本身品质怎样?

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


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

    本版积分规则

    热门推荐

    【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
    【花雕动手做】快餐盒盖,
    吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成
    关于串口通信协议的激光测距模块问题
    关于串口通信协议的激光测
    采用的是60m相位单点红外激光测距模组,模块与arduino mega采用串口相连接。模块为串
    DIY X-Y 平面激光器
    DIY X-Y 平面激光器
    DIY X-Y 平面激光器 总成本不到50元,性能一点不比市面的差. Arduino UNO x1 舵机 x2
    连杆形式的腿机构十一种:盘点机器人行走背后的机械原理
    连杆形式的腿机构十一种:
    机器人概念已经红红火火好多年了,目前确实有不少公司已经研制出了性能非常优越的机器
    【Arduino】108种传感器模块系列实验(21)--激光头传感器模块
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表