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通过串口下载固件。

注意点:
-
- 只能下载
hex文件;
- 只能下载
-
- 一定要选
DTR低,RTS高进BootLoader
- 一定要选
-
- 通过
Stm32CubeProgrammer应该也可以下载,但是目前没有连接成功!
- 通过
IAP
IAP是通过用户自己写的Bootloader进行固件更新,能够实现全自动远程固件更新。
标准库的IAP官方例程:
- STM32F4系列芯片的例程;
- STM32F3系列芯片的例程;
- 可通过
Google搜索STM32F3xx in-application programming相关关键字搜索其他系列的标准库IAP例程
HAL库的IAP官方例程:
4. HAL库IAP例程
以上的例程中,都是通过按键进入bootloader更新固件的,如果需要在APP中根据命令更新固件,则可以在bootloader的最后Flash页中添加一个标志位。如下是IAP的工作流程图:

Ymodem协议
通过上面的例程可以发现,ST官方所有的IAP都是通过Ymodem协议实现固件传输的,接下来大致分析一下这个Ymodem协议。
首先看下Ymodem协议的一些特性:
- Ymodem协议数据包格式:
3个字节协议头 + 128或1024字节有效数据 + 2字节校验码; - Ymodem协议数据包的有效数据可以为
128Bytes或者1024Bytes,但是第一个数据包有效数据必须为128Bytes; - Ymodem协议数据包的第
1个字节为0x01表示这个数据包的有效长度是128Bytes,数据包的第二个字节为0x02表示这个数据包的有效长度是1024Bytes; - Ymodem协议数据包的第
2个字节为数据包的序号,从0x00开始;依次为0x00, 0x01, 0x02...; - Ymodem协议数据包的第
3个字节为数据包的序号的取反,从0xFF开始;依次为0xFF, 0xFE, 0xFD...; - Ymodem协议数据包从第
4个字节到倒数第3个字节(一共128或1024个字节)为有效数据,当剩余的数据不足1024字节时,将通过128字节的数据包发送剩余的数据,最后不足128字节的数据需要补齐到128字节(一般补0x1A(EOF)或者0x00)再发送; - Ymodem协议数据包的最后两个字节为校验码。
首先假设我需要发送一个名为STM32_IAP_TEST_V1.0.bin,大小为1500 Bytes的bin文件(数据为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字节有效数据计算出来的校验码。
- 第二个数据包:
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个字节有效数据的验证码。
- 第三个数据包:
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










![[深度学习] 基于切片辅助超推理库SAHI优化小目标识别](https://img-blog.csdnimg.cn/img_convert/f986b1b381810b77f4290c7c3d051075.png)








