当前位置: 首页 > news >正文

esp32 JTAG 串口 bootload升级

文章目录

  • 一、前言
  • 二、了解 JTAG 和 Ymodem 的工作原理
    • 2.1 环境准备
    • 2.2 Ymodem 协议工作原理
    • 2.3 固件分区准备
  • 三、关键升级函数
  • 五、使用shell 测试

一、前言

如果使用 JTAG 串口 结合 Ymodem 协议 实现 ESP32 的固件升级,整体逻辑将围绕通过串口传输固件文件并将其烧录到指定的 Flash 分区。以下是完整的实现步骤和代码说明。为什么要使用ymodem,因为要对文件进行校验,使得数据丢失可以重传,为什么保证固件的完整性,所以使用ymodem协议

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

2.1 环境准备

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

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

ESP-IDF:开发 ESP32 所需的软件框架
参考上一篇文章 ymodem协议
https://blog.csdn.net/mayuxin1314/article/details/143990976

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 测试

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

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

相关文章:

esp32 JTAG 串口 bootload升级

文章目录 一、前言二、了解 JTAG 和 Ymodem 的工作原理2.1 环境准备2.2 Ymodem 协议工作原理2.3 固件分区准备 三、关键升级函数五、使用shell 测试 一、前言 如果使用 JTAG 串口 结合 Ymodem 协议 实现 ESP32 的固件升级&#xff0c;整体逻辑将围绕通过串口传输固件文件并将其…...

【linux】(17)压缩和解压

tar tar 是一个用于创建、维护、修改和解压缩存档文件的 Linux 命令。tar 常常用于备份文件或者将多个文件打包成一个文件以便于传输或存储。以下是 tar 命令的详细教程&#xff0c;包括常用选项和示例&#xff1a; 基本语法 tar [选项] [文件或目录]常用选项 -c&#xff1…...

摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现

随着科技的不断进步&#xff0c;摄像机视频分析软件的发展已经为我们的生活带来了许多便捷。其中&#xff0c;LiteAIServer视频智能分析平台的玩手机打电话检测算法技术尤为突出&#xff0c;它利用先进的图像处理和人工智能技术&#xff0c;能够自动识别并监控视频中的玩手机或…...

springboot购物推荐网站的设计与实现(代码+数据库+LW)

摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了东大每日推购物推荐网站的开发全过程。通过分析企业对于东大每日推购物推荐网站的需求&#xff0c;创建了一个计算机管理东大每日推购物推荐网站的方案。文章介…...

【Unity3D插件】Unity3D HDRP Outline高亮发光轮廓描边插件教程

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 最近用Unity3D的HDRP&#xff08;高清渲染管…...

QT基础 UI编辑器 QT5.12.3环境 C++环境

一、UI编辑器 注意&#xff1a;创建工程时&#xff0c;要勾上界面按钮 UI设计师界面的模块 UI编辑器会在项目构建目录中自动生成一个ui_xxx.h&#xff08;构建一次才能生成代码&#xff09;&#xff0c;来表示ui编辑器界面的代码&#xff0c;属于自动生成的&#xff0c;一定不…...

计算机网络socket编程(5)_TCP网络编程实现echo_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交…...

go语言闭包捕获的是变量的引用而不是变量的值

在 Go 语言中&#xff0c;闭包捕获的是变量的引用&#xff0c;而不是变量的值。这意味着闭包会引用循环变量或外部变量的实际内存位置&#xff0c;而不是在闭包创建时复制变量的值。这种行为有时会导致意外的结果&#xff0c;尤其是在循环中创建多个闭包时。 闭包捕获变量的引…...

周期法频率计的设计

目录 周期法频率计 分析&#xff1a; 设计过程&#xff1a; 周期法频率计 对于低频信号&#xff0c;应用周期法进行测频。周期法测频的基本原理是&#xff1a;应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数&#xff0c;然后通过脉冲数计算出被测信号的周期&#xff…...

【Linux】drop cache与reclaim的区别

前言 在 Linux 内核中&#xff0c;drop cache和reclaim是两种不同的内存管理机制&#xff0c;它们的目的和实现方式有所不同。 Drop Cache 定义 drop cache 是一种手动操作&#xff0c;允许用户通过向 /proc/sys/vm/drop_caches 写入特定的值&#xff0c;直接清除系统中的缓…...

【Linux课程学习】:命令行参数,环境变量

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 命令行参数&#xff1a; 用命令行参数实现不同…...

HTB:WifineticTwo[WriteUP]

目录 连接至HTB服务器并启动靶机 信息搜集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用curl访问靶机8080端口 使用浏览器直接访问/login路径 漏洞利用 使用searchsploit搜索该WebAPP漏洞 Payload USER_FLAG&#xff1a;bb…...

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…...

关于相机选型的一些参数说明

上一篇&#xff1a;关于相机的一些参数计算&#xff08;靶面、视野等&#xff09; 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS&#xff1a;视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…...

深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践20241120

深入解析 Cron 表达式高级用法&#xff1a;Spring 与 Linux Crontab 的全面对比与实践 任务调度是后台服务中的重要组成部分&#xff0c;无论是定期数据备份、日志归档还是周期性报表生成&#xff0c;Cron 表达式始终是描述这些任务规则的核心工具。本文将聚焦 Spring Cron 表…...

24软专 数据结构

1、A[n]&#xff0c;k&#xff0c;将数组向右循环移动k位。要求时间复杂度O(n)&#xff0c;空间O(1)。 思路&#xff1a;采用三次反转数组的操作&#xff0c;可以实现时间复杂度为O(n)&#xff0c;空间复杂度为O(1)的算法。 void moveElem(int array[],int k,int length){//a…...

洛谷 P1616 疯狂的采药 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题&#xff0c;最后一个超出空间了。完全背包和就是无限次的拿&#xff0c;公式跟01背包差不多。 但是&#xff0c;只有当前能拿和拿不下&#xff0c;换下一个。注意要处理好边界条件。…...

#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

element-plus入门教程:Button

一、Button组件概述 Element Plus的Button组件是一个常用的操作按钮&#xff0c;提供了多种类型、尺寸、状态等配置选项&#xff0c;以满足不同的交互需求。 二、安装Element Plus 在Vue 3项目中&#xff0c;可以通过npm或yarn来安装Element Plus。 npm install element-pl…...

oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist

oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程&#xff1a; OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…...

如何用deberta-v3-base-zeroshot-v2.0构建企业级NLP应用?完整教程来了

如何用deberta-v3-base-zeroshot-v2.0构建企业级NLP应用&#xff1f;完整教程来了 【免费下载链接】deberta-v3-base-zeroshot-v2.0 项目地址: https://ai.gitcode.com/hf_mirrors/NingBo_Ascend/deberta-v3-base-zeroshot-v2.0 deberta-v3-base-zeroshot-v2.0是一款基…...

从理论推导到代码实现:手把手教你用Python/Numpy写出守恒形式的NS方程求解器

从理论推导到代码实现&#xff1a;手把手教你用Python/Numpy写出守恒形式的NS方程求解器计算流体力学&#xff08;CFD&#xff09;的魅力在于它将抽象的数学方程转化为可执行的代码&#xff0c;让流体运动的奥秘在计算机中重现。对于已经掌握流体力学理论的中高级学习者来说&am…...

终极鼠标连点器使用指南:3分钟掌握高效自动化技巧

终极鼠标连点器使用指南&#xff1a;3分钟掌握高效自动化技巧 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;操作…...

【DeepSeek事件驱动架构实战指南】:20年架构师亲授5大核心陷阱与避坑清单

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek事件驱动架构全景认知 DeepSeek事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;并非单一技术组件的堆叠&#xff0c;而是一种以事件为第一公民、强调松耦合与异步协作的系统设计…...

告别浪费!SolidWorks企业级共享方案,实现降本增效全攻略

还在为 SolidWorks 高昂的硬件投入和混乱的图纸管理头疼&#xff1f;告别“一人一机”的浪费模式&#xff0c;企业级共享方案才是降本增效的正解。这套攻略基于“1 台高性能服务器 云飞云共享云桌面”架构&#xff0c;帮你把硬件成本砍掉 60%&#xff0c;把软件利用率翻倍。一…...

Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题

Godot4 2D游戏开发避坑指南&#xff1a;TileMap绘制、节点顺序与相机设置的三个常见问题当你第一次用Godot4完成一个2D场景搭建时&#xff0c;那种成就感往往会被几个突如其来的bug瞬间击碎——角色神秘消失、背景纹丝不动、屏幕边缘出现诡异黑边。这些问题看似简单&#xff0c…...

UE5 Mac环境搭好了,然后呢?给新手的第一个5分钟:创建、操控并理解你的第一个角色

UE5 Mac环境搭好了&#xff0c;然后呢&#xff1f;给新手的第一个5分钟&#xff1a;创建、操控并理解你的第一个角色当你第一次打开UE5的Mac版本&#xff0c;面对那个闪烁着光芒的启动界面&#xff0c;内心可能既兴奋又忐忑。安装只是第一步&#xff0c;真正的旅程现在才开始。…...

别再只用鼠标了!用Leap Motion手势控制Unity游戏,保姆级配置避坑指南(2024版)

2024年Unity手势交互开发实战&#xff1a;Leap Motion从配置到游戏逻辑全解析在游戏开发领域&#xff0c;交互方式的创新往往能带来全新的体验。想象一下&#xff0c;玩家不再需要键盘鼠标&#xff0c;仅凭自然的手部动作就能操控游戏角色——这正是Leap Motion手势识别技术为U…...

通过Taotoken标准OpenAI协议实现分钟级集成现有代码

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken标准OpenAI协议实现分钟级集成现有代码 1. 迁移背景与核心思路 许多开发团队在构建AI应用时&#xff0c;会直接使用O…...

PS5 NOR Modifier深度解析:如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版

PS5 NOR Modifier深度解析&#xff1a;如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版 【免费下载链接】PS5NorModifier The PS5 Nor Modifier is an easy to use Windows based application to rewrite your PS5 NOR file. This can be useful if your NOR is corru…...