首页 > 其他分享 >esp32 JTAG 串口 bootload升级

esp32 JTAG 串口 bootload升级

时间:2024-11-23 13:29:05浏览次数:8  
标签:RYM bootload err esp ota esp32 partition ESP 串口

文章目录

一、前言

如果使用 JTAG 串口 结合 Ymodem 协议 实现 ESP32 的固件升级,整体逻辑将围绕通过串口传输固件文件并将其烧录到指定的 Flash 分区。以下是完整的实现步骤和代码说明。

二、了解 JTAG 和 Ymodem 的工作原理

2.1 环境准备

JTAG 接口工具:如 FT2232、J-Link、ESP32 自带的 UART-to-USB。

终端工具支持 Ymodem 协议:如 TeraTerm 或 Minicom。

ESP-IDF:开发 ESP32 所需的软件框架

2.2 Ymodem 协议工作原理

  • 发送端:PC 端通过 Ymodem 协议将固件文件逐块传输到设备。
  • 接收端:ESP32 通过 UART 接口接收 Ymodem 数据并逐块校验。
  • 目标:将接收到的数据写入 OTA 分区。

2.3 固件分区准备

# ESP-IDF Partition Table
# Name,     Type,  SubType, Offset,   Size,      Flags
nvs,        data,  nvs,     0x9000,   200K,     
otadata,    data,  ota,     0x110000, 0x2000,
phy_init,   data,  phy,     0x112000, 0x1000,
factory,    app,   factory, 0x120000, 3M,      
ota_0,      app,   ota_0,   0x420000, 3M,      
ota_1,      app,   ota_1,   0x720000, 3M,      
font_data,  0x50,   0x22,    0xa20000, 2M,       
storage,    data,  littlefs,  0xc20000, 2M,    

三、关键升级函数

// 定义文件名和文件大小变量

static esp_ota_handle_t ota_handle;
OtaUpdate_t xOtaUpdate_t;
// xLocaUpdate_Begin 函数:初始化 OTA 更新
static enum rym_code xLocaUpdate_Begin(RYM_t *pxRYM_Ag, uint8_t *buf, uint32_t len)
{
    printf("xLocaUpdate_Begin\r\n");
    const esp_partition_t *running_partition = esp_ota_get_running_partition();
    const esp_partition_t *ota_partition = esp_ota_get_next_update_partition(NULL);

    if (ota_partition == NULL)
    {
        ESP_LOGE(TAG, "未找到 OTA 分区");
        return RYM_ERR_CAN;
    }

    ESP_LOGI(TAG, "当前分区地址: 0x%08" PRIx32 ", OTA 分区地址: 0x%08" PRIx32,
             running_partition->address, ota_partition->address);

    parseYModemData(buf,xOtaUpdate_t.ucFilename, &xOtaUpdate_t.ulFilesize);
    ESP_LOGI(TAG, "固件名字 %s 固件内容长度: %" PRIu32 " 字节\r\n",xOtaUpdate_t.ucFilename, xOtaUpdate_t.ulFilesize);

    // 初始化 OTA 会话
    esp_err_t err = esp_ota_begin(ota_partition, xOtaUpdate_t.ulFilesize, &ota_handle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "OTA 更新初始化失败: %s", esp_err_to_name(err));
        return RYM_ERR_CAN;
    }

    xOtaUpdate_t.bytes_written = 0; // 初始化已写入字节数
    return RYM_CODE_ACK;
}

// xLocaUpdate_Data 函数:写入固件数据
static enum rym_code xLocaUpdate_Data(RYM_t *pxRYM_Ag, uint8_t *buf, uint32_t len)
{
    // 检查剩余要写入的字节数
    uint32_t remaining_bytes = xOtaUpdate_t.ulFilesize - xOtaUpdate_t.bytes_written;

    // 如果接收的数据超过剩余的字节数,则只写入剩余部分
    if (len > remaining_bytes) {
        len = remaining_bytes;
    }

    // 写入数据到 OTA 分区
    esp_err_t err = esp_ota_write(ota_handle, buf, len);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "OTA 写入失败: %s", esp_err_to_name(err));
        return RYM_ERR_CAN;
    }

    // 更新已写入的字节数
    xOtaUpdate_t.bytes_written += len;
    ESP_LOGI(TAG, "写入了 %u 字节,总计写入 %u/%u 字节", (unsigned int)len, (unsigned int)xOtaUpdate_t.bytes_written, (unsigned int)xOtaUpdate_t.ulFilesize);

    return RYM_CODE_ACK;
}

// xLocaUpdate_End 函数:完成 OTA 更新
static enum rym_code xLocaUpdate_End(RYM_t *pxRYM_Ag, uint8_t *buf, uint32_t len)
{
    esp_err_t err = esp_ota_end(ota_handle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "OTA 更新结束失败: %s", esp_err_to_name(err));
        return RYM_ERR_CAN;
    }
   // 获取当前 OTA 分区的 SHA-256 校验值
    const esp_partition_t *ota_partition = esp_ota_get_next_update_partition(NULL);
    uint8_t sha256_hash[32];
    err = esp_partition_get_sha256(ota_partition, sha256_hash);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "获取 SHA-256 校验失败: %s", esp_err_to_name(err));
        return RYM_ERR_CAN;
    }

    // 输出 SHA-256 校验结果供验证
    ESP_LOGI(TAG, "OTA 分区 SHA-256 校验值:");
    for (int i = 0; i < 32; i++) {
        printf("%02x", sha256_hash[i]);
    }
    printf("\n");

    // // 将新固件设置为引导分区
    // const esp_partition_t *ota_partition = esp_ota_get_next_update_partition(NULL);
    err = esp_ota_set_boot_partition(ota_partition);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "设置引导分区失败: %s", esp_err_to_name(err));
        return RYM_ERR_CAN;
    }

    ESP_LOGI(TAG, "OTA 更新完成,设备将使用新固件引导");

    // 触发设备重启以加载新固件
    esp_restart();

    return RYM_CODE_ACK;
}


int ulLocalUpdate()
{
    int err = 0;
    err = RYM_ReadFile(&xRYM_Ag, xLocaUpdate_Begin, xLocaUpdate_Data, xLocaUpdate_End);
    return err;
}

五、使用shell 测试

  • 设置
    在这里插入图片描述

  • 测试
    在这里插入图片描述

标签:RYM,bootload,err,esp,ota,esp32,partition,ESP,串口
From: https://blog.csdn.net/mayuxin1314/article/details/143991002

相关文章

  • 测试stm32串口发送数据在不同条件下的效率
    一、测试不同波特率测试代码:while(1){ LED1_ON(); bsp_uart_Printf("这是一个测试程序%d\r\n",num); LED1_OFF(); bsp_uart_Printf("这是一个测试程序%d\r\n",num); num++;}voidbsp_uart_Printf(char*format,...){ va_listarg; v......
  • C# 串口通信教程
    串口通信(SerialCommunication)是一种用于设备之间数据传输的常见方法,通常用于与外部硬件设备(如传感器、机器人、微控制器)进行通信。在C#中,System.IO.Ports 命名空间提供了与串口设备交互的功能,可以轻松实现串口通信。本教程将引导你如何在C#中实现串口通信,并展示一些常......
  • 《ESP32从0到1》收官篇:wifi版温湿度蓝牙网关
            文章内容:以“wifi版温湿度蓝牙网关”这一具体项目为载体,对《ESP32从0到1》专辑前面所有内容的整合练习。        本篇设定为VIP可见,未开通VIP的可移至如下链接,每个组件功能之前均有单独发布,且涉及到的源码也已上传,可自行下载。《ESP32从0到1》快速......
  • 无线串口模块—配置软件以及串口助手的使用
    1、适用型号本文适用于无线串口模块调试。文中的软件界面截图,可能会由于软件系列、软件版本不同而略有区别。2、使用参数设置软件RF_Setting使用方法(以E32-433TBL-01型号lora模块开发测试套件说明)说明:E32-433TBL-01是贴片串口模块结合USB转TTL串口底板形成的无线模块开发成套测试产......
  • Linux 外设驱动 应用 3 串口
    3串口3.1串口原理串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIARS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。串口通讯......
  • ESP32-IDF GPIO 专题
    目录一、基本介绍1、配置结构体2、API2.1gpio_config2.2gpio_reset_pin2.3gpio_set_intr_type2.4gpio_intr_enable2.5gpio_intr_disable2.6gpio_set_level2.7gpio_get_level2.8gpio_set_direction2.9gpio_set_pull_mode2.10gpio_isr_register2.11gpio_install......
  • bootloader学习笔记-从零开发bootloader(4)
    概要Flash区域划分,从不同的区域启动用户程序,实现覆写代码的功能。Flash区域划分我们的Flash是从0x08000000开始的,具体能用的大小需要查看芯片手册,例如,我的GD32F303RC芯片,flash可用的区域为256KB,内存可用大小为48KB。256KB也就是262144字节的大小,转换成16进制为0x40000,也......
  • C# 实现串口通信
    usingSystem;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;namespaceDAL{publicclassAsySerialDal{privatestaticreadonlyobjectsyncRoot=newobject();constintCOMDAL_RECVBUF_SIZE......
  • 【ESP32】ESP32系列选型
    1.ESP32-P1.1ESP32-P4(32bitRISC-VMCU)ESP32-P4搭载双核RISC-V处理器,拥有AI指令扩展、先进的内存子系统,并集成高速外设。ESP32-P4专为高性能和高安全的应用设计,充分满足下一代嵌入式应用对人机界面支持、边缘计算能力和IO连接特性等方面提出的更高需求。性能ESP32......
  • STM32与ESP32串口数据发送以及网页端数据实时显示和远程遥控
    目标:实现网页端速度实时显示以及可以通过点击页面按键达到对小车的位移方位控制。一、ESP32代码首先,需要让ESP32连接到WiFi,这样才能为后续的操作做准备。ssid="xxxxxx"password="xxxxxx"#WIFI连接defwifi_connect():wlan=network.WLAN(network.STA_IF)#STA模式......