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