STM32的升级--ICP/ISP/IAP以及Ymodem协议分析

news2024/11/16 13:42:04

ICP/ISP/IAP 区别

ICP(In-Circuit Programing): 通过J-Link/SWD等下载器烧写程序,上位机需要借助其他硬件的参与才能更新固件,可以更新MCU的所有存储区域;
ISP(In-System Programing): 通过MCU出厂时固化的一个bootloader升级程序,上位机可以直接通过指定通讯口更新固件,可以更新除bootloader之外的存储区域;
IAP(In-Applicating Programing): 需要将Flash区域分成两份,一份用于存储用户自己写的bootloader,一份用于存储程序功能的UserApp,只能更新UserApp

ICP

直接通过J-Link/SWD下载程序,略。

ISP

FlyMCU.exe 下载地址
ISP 操作说明
利用FlyMCU.exe通过串口下载固件。
在这里插入图片描述
注意点:

    1. 只能下载hex文件;
    1. 一定要选DTR低,RTS高进BootLoader
    1. 通过Stm32CubeProgrammer应该也可以下载,但是目前没有连接成功!

IAP

IAP是通过用户自己写的Bootloader进行固件更新,能够实现全自动远程固件更新。
标准库的IAP官方例程:

  1. STM32F4系列芯片的例程;
  2. STM32F3系列芯片的例程;
  3. 可通过Google搜索STM32F3xx in-application programming相关关键字搜索其他系列的标准库IAP例程

HAL库的IAP官方例程:
4. HAL库IAP例程

以上的例程中,都是通过按键进入bootloader更新固件的,如果需要在APP中根据命令更新固件,则可以在bootloader的最后Flash页中添加一个标志位。如下是IAP的工作流程图:
IAP工作流程

Ymodem协议

通过上面的例程可以发现,ST官方所有的IAP都是通过Ymodem协议实现固件传输的,接下来大致分析一下这个Ymodem协议。

首先看下Ymodem协议的一些特性:

  1. Ymodem协议数据包格式:3个字节协议头 + 128或1024字节有效数据 + 2字节校验码
  2. Ymodem协议数据包的有效数据可以为128Bytes或者1024Bytes,但是第一个数据包有效数据必须为128Bytes
  3. Ymodem协议数据包的第1个字节为0x01表示这个数据包的有效长度是128Bytes,数据包的第二个字节为0x02表示这个数据包的有效长度是1024Bytes
  4. Ymodem协议数据包的第2个字节为数据包的序号,从0x00开始;依次为0x00, 0x01, 0x02...
  5. Ymodem协议数据包的第3个字节为数据包的序号的取反,从0xFF开始;依次为0xFF, 0xFE, 0xFD...
  6. Ymodem协议数据包从第4个字节到倒数第3个字节(一共1281024个字节)为有效数据,当剩余的数据不足1024字节时,将通过128字节的数据包发送剩余的数据,最后不足128字节的数据需要补齐到128字节(一般补0x1A(EOF)或者0x00)再发送;
  7. Ymodem协议数据包的最后两个字节为校验码。

首先假设我需要发送一个名为STM32_IAP_TEST_V1.0.bin,大小为1500 Bytesbin文件(数据为0x00~0xFF循环填充)。则Ymodem发送端发送的数据包如下:
8. 第一个数据包:

01 00 ff 53 54 4d 33 32 5f 49 41 50 5f 54 45 53 54 5f 56 31 2e 30 2e 62 69 6e 00 31 35 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b1 c0

以上数据包的第1个字节为0x01,表示这是一个有效数据长度为128字节的数据包,第2-3个字节为0x00, 0xFF表示这是第一个数据包。
第一个数据包包含的是发送文件的文件名以及文件大小,都是以字符串格式发送的;比如53 54 4d 33 32 5f 49 41 50 5f 54 45 53 54 5f 56 31 2e 30 2e 62 69 6e 00就表示了文件名STM32_IAP_TEST_V1.0.bin,而31 35 30 30 00则表示文件长度为1500 Bytes;接下来的0x00是由于有效数据长度不足128字节而补齐的;最后两个字节是根据前面的128字节有效数据计算出来的校验码。

  1. 第二个数据包:
02 01 fe 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 
2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 
93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 
c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 
f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 
29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 
5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 
8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be 
bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 
f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 
23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 
55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 
87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 
b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea 
eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 
1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 
4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 
81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 
b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 
e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff c2 e0 

第二个数据包的第1个字节为0x02,表明这是一个有效数据长为1024字节的数据包。第2-3个字节为01 fe,表示这是第2个数据包。
接下来的1024个字节的数据(4组0x00~0xFF)是虚拟的有效数据。最后的c2 e0是这1024个字节有效数据的验证码。

  1. 第三个数据包:
01 02 fd 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 
2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f e8 0a

第四个数据包:

01 03 fc 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae 
af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 
e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 53 e8

第五个数据包:

01 04 fb 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 
2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f e8 0a

第六个数据包:

01 05 fa 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae 
af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db 1a 1a 1a 1a 1a 
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 87 6f

第七个数据包:

04

第八个数据包:

01 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第九个数据包:

04

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重点算法排序之快速排序、归并排序(上篇)

文章目录 一、排序的概念及常见的排序算法 二、快速排序的思想及代码详解 2、1 快速排序的思想 2、2 挖坑法 2、2、1 挖坑法实现思想 2、2、2 挖坑法举例 2、2、3 挖坑法代码实现 2、3 左右指针法 2、3、1 左右指针法实现思想 2、3、2 左右指针法举例 2、3、3 左右指针法代码…

类的成员之四:代码块

文章目录一、代码块静态代码块非静态代码块注意总结:由父及子,静态先行属性赋值总结一、代码块 1、代码块的作用:用来初始化类、对象 2、代码块如果有修饰的话,只能使用static 3、分类:静态代码块 vs 非静态代码块 静…

Ubuntu自动登录脚本

Ubuntu自动登录脚本一、!/usr/bin/expect -f的意义二、spawn命令行:三、send命令:四、expect五、interact命令:本人用xshell的SSH登录云服务器,需要从用户Ubuntu切换到root,再切换到lighthouse。编辑了一个自动切换用户…

2-1进程管理-进程与线程

文章目录1.进程2.进程控制块(PCB)3.进程的状态与转换4.进程通信8.线程9.线程和进程的比较10.线程的实现方式11.多线程模型20.线程的状态与转换1.进程 (1)进程是程序的一次执行过程 (2)进程是进程实体的运行…

JavaScript篇.day09-数据类型,表达式,运算符,作用域,语句,严格模式

目录1.数据类型(1)原始数据类型(2)隐式转换(3)逻辑语句中的类型转换(4)数据类型检测2.表达式3.运算符(1)分类(2)其他4.作用域5.语句6.严格模式1.数据类型(1)原始数据类型number, string, boolean, null, undefined, object object对象包含: Array, Function, Date...function f…

【微服务笔记03】微服务组件之Eureka注册中心高可用集群环境搭建

这篇文章,主要介绍微服务组件之Eureka注册中心高可用集群环境搭建。 目录 一、Eureka集群环境 二、搭建Eureka高可用集群环境 2.1、前提准备 (1)修改hosts配置文件 (2)创建父工程项目 2.2、搭建Eureka注册中心 …

数据可视化大屏Echarts高级开发散点图实战案例分析(地图扩展插件bmap.min.js、散点图、百度地图控件、柱图、涟漪动图、条件判断颜色)

系列文章目录 燃,拿来即用!Echarts动态排名柱状图(自适应电脑和手机端)漏刻有时数据可视化Echarts组件开发(27):盒须图(箱线图)前后端php交互的实战案例漏刻有时数据可视化Echarts组件开发(26):全国地图三级热力图下钻和对接api自动调用数据…

高压功率放大器在高校实验室的实际应用领域介绍

功率放大器的应用领域是很多电子工程师都关心的问题,那么功率放大器的使用场景又有哪些呢,下面来介绍一下安泰高压功率放大器在各个高校的实际应用情况。 图:激光切割 一、ATA-1000系列宽带功率放大器 应用领域:激光切割 适用高校…

Power BI 可视化修改配色

示例数据: 一、Power BI 按列排序 当把文本字段放在坐标轴,显示的顺序都乱了,完全不是自己想要的,就像下图所示: 默认按照Y轴的数值降序排序,如果选择按照month 以升序排序,就会如下所示&am…

【CDP】CDP集群如何通过Cloudera Manager配置使用SNMP方式转发告警

前言 这篇文章参考了大神的文章,如何在CDH平台上集成SNMP服务,然后实现了CDP集群集成SNMP服务,这里描述下,如何集成步骤,在CDP集群中告警是一个很重要的信息,最直观的衡量一个集群的健康状况,那…

[深度学习] 基于切片辅助超推理库SAHI优化小目标识别

对象检测是迄今为止计算机视觉中最重要的应用领域。然而,小物体的检测和大图像的推理仍然是实际使用中的主要问题,这是因为小目标物体有效特征少,覆盖范围少。小目标物体的定义通常有两种方式。一种是绝对尺度定义,即以物体的像素…

【小程序】自定义组件

文章目录组件的创建与引用自定义组件的样式自定义组件的数据、方法和属性data数据methods 方法properties 属性数据监听器纯数据字段组件的生命周期组件所在页面的生命周期插槽单个插槽多个插槽父子组件之间的通信behaviors组件的创建与引用 创建一个组件的步骤: …

发票额度报销最优排列组合问题

1、问题描述 因为我的公司每个月给员工会有一定的交通费额度,需要拿发票去报销才能获得的。要求的是发票总金额不能大于报销的额度。因此在实际报销的时候,你要一张张发票去排列组合经可能的把报销金额往报销额度那里去凑。比如你有1000元额度&#xff0…

Unity 3D JavaScript 脚本基础||Unity 3D C# 脚本基础

变量 数值变量。var a1000;var b3.1415926;字符串变量。 是由单引号或双引号括起来的 Unicode 字符序列。 布尔值。 只有 true 和 false 。用来描述某个事物为真或为假。 数组 是数据的集合,数组中的每一个元素都有自己独有的下标,下标从0开始计数。 表…

《收获,不止Oracle》读书笔记之第三章逻辑体系世界

1.数据库有序的逻辑体系 2.逻辑体系从老余养殖细细说起 推出的逻辑结构是:表空间(tablespace)、段(segment)、区(extent)、块(block)。Oracle server正是有条理地通过表空…

基础数学(七)——线性方程组的数值解法

文章目录考试要求基础知识一般求解思路消元法高斯消元法小主元导致的计算失误高斯列主元素消去法(期末考试要求之一)高斯消元法例题(期末必考)高斯消元法的优缺点减少fill-in现象(了解)矩阵分解Doolittle分…

【ROS】——常用命令(五)

文章目录前言1. rosnode1.1 rosnode list 列出活动节点1.2 rosnode ping 测试到节点的连接状态1.3 rosnode info 打印节点信息1.4 rosnode machine 列出指定设备上节点1.5 rosnode kill 杀死某个节点1.6 rosnode cleanup 清除不可连接的节点2. rostopic2.1 rostopic list(-v)2.…

【学习】深度强化学习

李宏毅深度学习一、深度强化学习Deep Reinforcement Learning (RL)什么是RL?(三步骤)计算loss计算A版本0版本1版本2版本32、梯度方法收集训练数据:探索3、actor criticMCTD版本3.5一、深度强化学习Deep Reinforcement Learning (RL) 什么是R…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的图像语义分割模型

给我推荐20个比较流行的图像语义分割模型 在这里列出20个比较流行的图像语义分割模型:U-Net Mask R-CNN Fully Convolutional Network (FCN) SegNet DeepLab v3 PSPNet ENet ICNet RefineNet DenseASPP DenseNet LinkNet FPN BiSeNet ENAS Deeplab v3 GCN CRF-RNN …

Linux环境变量

文章目录什么是环境变量?什么是本地变量?如何获取环境变量?在shell中在程序中如何添加/删除环境变量&&本地变量?在shell中在程序中为什么环境变量能够被子进程继承?什么是环境变量? 环境变量是进程…