GD32或STM32(GD32F103RB)用Ymodem升级

Ymodem 协议详解-CSDN博客,推荐先看这个文章。

产品的代码一般以boot+app的形式开发。boot的目的是:例如用串口等外部接口给产品升级,主要给现场维护升级或者客户使用,因为现场很少有Jlink、STlink等专业烧录工具。

为什么说到Ymodem升级协议(用bin文件升级),因为有通用的小工具、小软件是支持Ymodem功能的(例如SecureCRT ,Tera Term),这里推荐Tera Term,because我使用SecureCRT没调试成功。简单说就是按照Ymodem协议去写mcu的boot程序,就省掉了开发用来升级mcu的上位机,用Tera Term升级即可。

先介绍Ymodem协议:

本文截图都来自:Ymodem 协议详解-CSDN博客

涉及的命令由以下几条:

涉及的帧:主要有三条

说明一下涉及的三条帧与命令的关系:可以理解为帧是大的流程,即升级的流程(或者传输数据的流程)。命令是完成这个流程,当中需要使用到的交互,即让上位机知道目前MCU是什么状态(或者反过来)

用bin文件升级,如果工程没有生成bin,可以参考以下: 添加  fromelf.exe --bin -o "$L@L.bin" "#L"

Tera Term软件设置好串口、波特率

设置好后,再上电MCU,Tera Term会有打印信息。

以下是实际串口数据包的分析;

上位机起始帧发了好多帧
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 

//---------------------------------------------------------------------起始帧
//---------------------------------------------------------------------
01 00 FF 61 70 70 32 2E 62 69 6E 00 32 34 32 30 20 31 34 35 34 33 31 35 37 35 37 37 20 31 30 30 36 34 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 EE 

06--------------------------从:回ACK 
43--------------------------从:C已经准备好 

//----------------------------------------------------------------------数据帧发送开始
//-----------------------------------------------------------------------
02 01 FE A8 40 00 20 A1 21 00 08 69 22 00 08 61 22 00 08 65 22 00 08 5B 22 00 08 11 24 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 97 22 00 08 5F 22 00 08 00 00 00 00 95 22 00 08 99 22 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 BB 21 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BB 21 00 08 00 F0 02 F8 00 F0 3A F8 0A A0 90 E8 00 0C 82 44 83 44 AA F1 01 07 DA 45 01 D1 00 F0 2F F8 AF F2 09 0E BA E8 0F 00 13 F0 01 0F 18 BF FB 1A 43 F0 01 03 18 47 E0 07 00 00 00 08 00 00 10 3A 24 BF 78 C8 78 C1 FA D8 52 07 24 BF 30 C8 30 C1 44 BF 04 68 0C 60 70 47 00 00 00 23 00 24 00 25 00 26 10 3A 28 BF 78 C1 FB D8 52 07 28 BF 30 C1 48 BF 0B 60 70 47 1F B5 1F BD 10 B5 10 BD 00 F0 31 F8 11 46 FF F7 F7 FF 00 F0 97 FA 00 F0 4F F8 03 B4 FF F7 F2 FF 03 BC 00 F0 57 F8 00 00 09 48 80 47 09 48 00 47 FE E7 FE E7 FE E7 FE E7 FE E7 FE E7 FE E7 FE E7 FE E7 FE E7 04 48 05 49 05 4A 06 4B 70 47 00 00 BD 22 00 08 05 21 00 08 A8 00 00 20 A8 40 00 20 A8 20 00 20 A8 20 00 20 70 47 70 47 70 47 75 46 00 F0 2C F8 AE 46 05 00 69 46 53 46 20 F0 07 00 85 46 18 B0 20 B5 FF F7 DD FF BD E8 20 40 4F F0 00 06 4F F0 00 07 4F F0 00 08 4F F0 00 0B 21 F0 07 01 AC 46 AC E8 C0 09 AC E8 C0 09 AC E8 C0 09 AC E8 C0 09 8D 46 70 47 10 B5 04 46 AF F3 00 80 20 46 BD E8 10 40 FF F7 A8 BF 00 00 00 48 70 47 48 00 00 20 01 49 18 20 AB BE FE E7 26 00 02 00 70 47 00 BF FE E7 70 47 00 BF FE E7 00 BF FE E7 70 47 00 00 10 B5 00 28 07 DA 0A 07 14 0E 05 4A 00 F0 0F 03 1B 1F D4 54 03 E0 0A 07 13 0E 02 4A 13 54 10 BD 18 ED 00 E0 00 E4 00 E0 70 47 70 47 00 B5 06 48 00 68 40 1C 04 49 08 60 00 F0 C0 F8 03 48 00 68 40 1C 02 49 08 60 00 BD 08 00 00 20 0C 00 00 20 10 B5 14 48 00 68 40 F0 01 00 12 49 08 60 08 46 40 68 11 49 08 40 0F 49 48 60 08 46 00 68 0F 49 08 40 0C 49 08 60 08 46 00 68 20 F4 80 20 08 60 08 46 40 68 0A 49 08 40 06 49 48 60 08 46 00 68 06 49 08 40 03 49 08 60 4F F4 1F 00 88 60 00 F0 77 FA 10 BD 00 10 02 40 0C 00 FF E8 FF FF F6 FE FF FF 00 F7 00 22 33 4B 1A 70 33 4A 11 68 33 4A 12 68 88 1A 05 28 0A D3 30 4A 12 68 52 1D 2F 4B 1A 60 2C 4A 12 78 42 F0 01 02 2A 4B 1A 70 2C 4A 12 68 88 1A 0A 28 0A D3 29 4A 12 68 0A 32 28 4B 1A 60 24 4A 12 78 42 F0 02 02 22 4B 1A 70 25 4A 12 68 88 1A 19 28 0A D3 22 4A 12 68 19 32 21 4B 1A 60 1C 4A 12 78 42 F0 04 02 1A 4B 1A 70 1E 4A 12 68 88 1A 64 28 0A D3 1B 4A 12 68 64 32 1A 4B 1A 60 14 4A 12 78 42 F0 08 02 12 4B 1A 70 17 4A 12 68 88 1A C8 28 0A D3 14 4A 12 68 C8 32 13 4B 1A 60 0C 4A 12 78 42 F0 10 02 0A 4B 1A 70 10 4A 12 68 88 1A B0 F5 FA 7F 0B D3 0D 4A 12 68 02 F5 FA 72 0B 4B 1A 60 03 4A 12 78 42 F0 20 02 01 4B 1A 70 70 47 14 00 00 20 08 00 00 20 18 00 00 20 1C 00 00 20 4E 77 ------------主:数据
06 ------------------------从:回ACK 

02 02 FD 20 00 00 20 24 00 00 20 28 00 00 20 2C 00 00 20 00 BF FE E7 03 49 08 60 00 BF 02 49 09 68 00 29 FB D1 70 47 04 00 00 20 04 48 00 68 20 B1 03 48 00 68 40 1E 01 49 08 60 70 47 00 00 04 00 00 20 41 61 70 47 01 61 70 47 F0 B5 04 46 16 46 00 25 00 22 01 F0 0F 05 01 F0 10 07 07 B1 35 43 00 20 1E E0 01 27 87 40 1F 40 C7 B1 22 68 4F EA 80 0C 0F 27 07 FA 0C F7 BA 43 87 00 05 FA 07 F7 3A 43 28 29 04 D1 01 27 87 40 1F 40 67 61 05 E0 48 29 03 D1 01 27 87 40 1F 40 27 61 22 60 47 1C B8 B2 08 28 DE D3 08 20 22 E0 01 27 87 40 1F 40 E7 B1 62 68 A0 F1 08 07 4F EA 87 0C 0F 27 07 FA 0C F7 BA 43 A0 F1 08 07 BF 00 05 FA 07 F7 3A 43 28 29 04 D1 01 27 87 40 1F 40 67 61 05 E0 48 29 03 D1 01 27 87 40 1F 40 27 61 62 60 47 1C B8 B2 10 28 DA D3 F0 BD 02 46 90 68 08 40 08 B1 01 20 70 47 00 20 FC E7 10 B5 4F F4 C0 60 00 F0 05 F9 40 F2 04 60 00 F0 01 F9 4F F4 C0 43 03 22 10 21 02 48 FF F7 92 FF 10 BD 00 00 00 10 01 40 10 B5 40 F2 03 60 00 F0 F1 F8 07 23 03 22 48 21 01 48 FF F7 83 FF 10 BD 00 0C 01 40 70 B5 04 46 00 26 21 46 27 48 FF F7 CF FF 05 46 26 48 00 5D 30 B1 01 28 0D D0 02 28 20 D0 03 28 3B D1 35 E0 35 B9 00 20 21 49 41 F8 24 00 01 20 1E 49 08 55 35 E0 7D B9 1D 48 50 F8 24 00 40 1C 1B 49 41 F8 24 00 08 46 50 F8 24 00 03 28 06 D3 02 20 16 49 08 55 02 E0 00 20 14 49 08 55 20 E0 25 B1 01 26 00 20 11 49 08 55 10 E0 10 48 50 F8 24 00 40 1C 0E 49 41 F8 24 00 08 46 50 F8 24 00 B0 F5 96 7F 03 D3 0A 26 03 20 08 49 08 55 08 E0 15 B1 00 20 05 49 08 55 03 E0 00 20 03 49 08 55 00 BF 00 BF 30 46 70 BD 00 0C 01 40 39 00 00 20 3C 00 00 20 10 B5 2A 48 00 78 00 F0 02 00 00 28 4D D0 02 20 FF F7 9C FF 26 49 08 70 01 20 FF F7 97 FF 25 49 08 70 04 20 FF F7 92 FF 23 49 08 70 20 48 00 78 01 28 02 D0 0A 28 0C D1 05 E0 4F F4 00 51 1F 48 FF F7 02 FF 06 E0 4F F4 00 51 1C 48 FF F7 FA FE 00 E0 00 BF 00 BF 17 48 00 78 01 28 02 D0 0A 28 0C D1 05 E0 4F F4 80 41 14 48 FF F7 ED FE 06 E0 4F F4 80 41 11 48 FF F7 E5 FE 00 E0 00 BF 00 BF 0D 48 00 78 01 28 02 D0 0A 28 0C D1 05 E0 4F F4 00 51 0A 48 FF F7 D8 FE 06 E0 4F F4 00 51 07 48 FF F7 D0 FE 00 E0 00 BF 00 BF 10 BD 14 00 00 20 35 00 00 20 36 00 00 20 37 00 00 20 00 10 01 40 00 20 00 F0 1F F8 4F F4 00 51 88 03 00 F0 10 F8 72 B6 00 F0 99 F8 FF F7 17 FF FF F7 29 FF 62 B6 00 F0 BA F8 03 E0 FF F7 1D FE FF F7 89 FF FA E7 02 4A 0A 40 02 43 02 4B 1A 60 70 47 80 FF FF 1F 08 ED 00 E0 04 4A 51 68 21 F4 60 51 41 EA 00 02 01 4B 5A 60 70 47 00 00 00 10 02 40 06 4A 02 EB 90 11 09 68 00 F0 1F 03 01 22 9A 40 11 43 02 4B 03 EB 90 12 11 60 70 47 00 10 02 40 00 20 00 21 2C 4A 12 68 42 F4 80 32 2A 4B 1A 60 00 BF 40 1C 28 4A 12 68 02 F4 00 31 19 B9 4F F6 FF 72 90 42 F5 D1 24 4A 12 68 02 F4 00 32 0A B9 00 BF FE E7 20 4A 52 68 1F 4B 5A 60 1A 46 52 68 5A 60 1A 46 52 68 42 F4 80 62 5A 60 1A 46 52 68 22 F4 40 32 5A 60 1A 46 52 68 42 F4 40 32 5A 60 1A 46 52 68 15 4B 1A 40 13 4B 5A 60 1A 46 52 68 13 4B 1A 43 10 4B 5A 60 1A 46 12 68 42 F0 80 72 1A 60 00 BF 0C 4A 12 68 02 F0 00 72 00 2A F9 D0 09 4A 52 68 22 F0 03 02 07 4B 5A 60 1A 46 52 68 42 F0 02 02 5A 60 00 BF 03 4A 52 68 02 F0 08 02 00 2A F9 D0 70 47 00 00 00 10 02 40 FF FF C3 F7 00 00 28 08 10 B5 FF F7 D8 AB ------------主:数据
06 -------------------------从:回ACK 

02 03 FC 9B FF 10 BD 10 B5 12 48 00 68 4F F4 7A 71 B0 FB F1 F4 60 1E B0 F1 80 7F 01 D3 01 20 0F E0 60 1E 4F F0 E0 21 48 61 0F 21 4F F0 FF 30 FF F7 1E FD 00 20 4F F0 E0 21 88 61 07 20 08 61 00 20 08 B1 00 BF FE E7 00 21 48 1E FF F7 10 FD 10 BD 00 00 00 00 00 20 10 B5 4F F4 7A 70 FF F7 DB FD 4F F4 00 51 2C 48 FF F7 EE FD 4F F4 7A 70 FF F7 D2 FD 4F F4 00 51 27 48 FF F7 E3 FD 4F F4 80 41 25 48 FF F7 E0 FD 4F F4 7A 70 FF F7 C4 FD 4F F4 80 41 20 48 FF F7 D5 FD 4F F4 00 51 1E 48 FF F7 D2 FD 4F F4 7A 70 FF F7 B6 FD 4F F4 00 51 19 48 FF F7 C7 FD 4F F4 80 41 17 48 FF F7 C4 FD 4F F4 7A 70 FF F7 A8 FD 4F F4 80 41 12 48 FF F7 B9 FD 4F F4 00 51 10 48 FF F7 B6 FD 4F F4 7A 70 FF F7 9A FD 4F F4 00 51 0B 48 FF F7 AB FD 4F F4 80 41 09 48 FF F7 A8 FD 4F F4 7A 70 FF F7 8C FD 4F F4 80 41 04 48 FF F7 9D FD 4F F4 00 51 02 48 FF F7 9A FD 10 BD 00 00 00 10 01 40 38 29 00 08 00 00 00 20 3C 00 00 00 40 21 00 08 74 29 00 08 3C 00 00 20 6C 40 00 00 5C 21 00 08 00 F3 6F 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 1A 1A 1A 1A 4C E0 ------------主:数据
06 -------------------------从:回ACK 
//-----------------------------------------------------------------------数据发送帧结束

//----------------------------------------------------------------------EOT结束帧
//-----------------------------------------------------------------------
04 --------------------------主:EOT 
15 --------------------------从:回NAK
04 --------------------------主:EOT 
06 --------------------------从:回ACK 
43 --------------------------从:回C确认结束

//--------------------------------------------------------------------------结束帧
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 06 50 72 6F 67 72 61 6D 6D 69 6E 67 20 43 6F 6D 70 6C 65 74 65 64 2E 0A 0D 

另外讲下用SecureCRT失败的原因:用1024发帧的时候,起始帧如下:即起始帧竟然是STX开头也就是起始帧是1024字节的数据。具体可能是我没设置好,没有再去纠结了。

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是STM32F103的Ymodem升级程序示例代码: ``` #include "stm32f10x.h" #include "stdio.h" #define FLASH_APP1_ADDR 0x08010000 // APP1地址 #define FLASH_APP2_ADDR 0x08020000 // APP2地址 #define FLASH_APP_SIZE 0x00010000 // 每个APP的大小为64KB #define FLASH_PAGE_SIZE 0x400 // Flash每页大小为1KB #define YMODEM_SOH 0x01 #define YMODEM_STX 0x02 #define YMODEM_EOT 0x04 #define YMODEM_ACK 0x06 #define YMODEM_NAK 0x15 #define YMODEM_CAN 0x18 #define YMODEM_C 0x43 #define YMODEM_TIMEOUT 1000 // 超时时间 #define YMODEM_MAX_SIZE 64 // Ymodem每个数据包大小为128字节,实际使用时使用64字节即可 static uint8_t ymodem_get_char(uint8_t *data); static uint8_t ymodem_wait_ack(void); static uint8_t ymodem_calc_checksum(uint8_t *data, uint32_t size); static uint8_t ymodem_write_packet(uint8_t *data, uint32_t size); static void ymodem_write_flash(uint8_t *data, uint32_t size); static uint8_t ymodem_file_receive(uint32_t addr); int main(void) { if (ymodem_file_receive(FLASH_APP1_ADDR) == YMODEM_ACK) { // APP1接收成功,重启执行APP1 NVIC_SystemReset(); } else if (ymodem_file_receive(FLASH_APP2_ADDR) == YMODEM_ACK) { // APP2接收成功,重启执行APP2 NVIC_SystemReset(); } while (1); } static uint8_t ymodem_get_char(uint8_t *data) { uint32_t timer = YMODEM_TIMEOUT; while (timer--) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) { *data = USART_ReceiveData(USART1); return YMODEM_ACK; } } return YMODEM_NAK; } static uint8_t ymodem_wait_ack(void) { uint8_t ret = 0; uint8_t data = YMODEM_NAK; uint32_t timer = YMODEM_TIMEOUT; while (timer--) { ret = ymodem_get_char(&data); if (ret == YMODEM_ACK) { return YMODEM_ACK; } } return YMODEM_NAK; } static uint8_t ymodem_calc_checksum(uint8_t *data, uint32_t size) { uint8_t checksum = 0; uint32_t i; for (i = 0; i < size; i++) { checksum += data[i]; } return checksum; } static uint8_t ymodem_write_packet(uint8_t *data, uint32_t size) { uint8_t ret = 0; uint8_t packet[YMODEM_MAX_SIZE + 6]; // 数据包大小为64字节,加上头部3字节和尾部3字节 uint32_t i; packet[0] = size == 128 ? YMODEM_SOH : YMODEM_STX; // 根据数据包大小确定头类型 packet[1] = 0xFF - size; // 数据包大小的补码 packet[2] = size == 128 ? 0x00 : 0x01; // 序号,128字节为0,64字节为1 for (i = 0; i < size; i++) { packet[i + 3] = data[i]; } for (i = size + 3; i < YMODEM_MAX_SIZE + 3; i++) { packet[i] = 0x00; // 填充0 } uint8_t checksum = ymodem_calc_checksum(&packet[3], size); packet[YMODEM_MAX_SIZE + 3] = checksum; packet[YMODEM_MAX_SIZE + 4] = 0x00; // 结束标志 packet[YMODEM_MAX_SIZE + 5] = 0x00; // 结束标志 for (i = 0; i < 3; i++) { ret = USART_SendData(USART1, packet[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } for (i = 3; i < YMODEM_MAX_SIZE + 6; i++) { ret = USART_SendData(USART1, packet[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } return ymodem_wait_ack(); } static void ymodem_write_flash(uint8_t *data, uint32_t size) { uint32_t i; uint32_t flash_addr = FLASH_APP1_ADDR; // 默认写入APP1 uint8_t flash_erase = 0; // 是否需要擦除 // 判断写入目标地址 if (*((uint32_t *)data) == 0x08020000) { flash_addr = FLASH_APP2_ADDR; } // 判断是否需要擦除 if (flash_addr == FLASH_APP1_ADDR) { if (*((uint32_t *)FLASH_APP1_ADDR) != 0xFFFFFFFF) { flash_erase = 1; } } else { if (*((uint32_t *)FLASH_APP2_ADDR) != 0xFFFFFFFF) { flash_erase = 1; } } // 擦除Flash if (flash_erase) { FLASH_Unlock(); FLASH_ErasePage(flash_addr); FLASH_Lock(); } // 写入数据到Flash FLASH_Unlock(); for (i = 0; i < size; i += 4) { FLASH_ProgramWord(flash_addr + i, *((uint32_t *)(data + i))); } FLASH_Lock(); } static uint8_t ymodem_file_receive(uint32_t addr) { uint8_t ret = 0; uint8_t data[YMODEM_MAX_SIZE]; uint32_t size = 0; uint32_t i; // 发送开始传输命令 uint8_t cmd = YMODEM_C; for (i = 0; i < 3; i++) { ret = USART_SendData(USART1, cmd); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } while (1) { // 等待数据包 ret = ymodem_wait_ack(); if (ret != YMODEM_SOH && ret != YMODEM_STX) { return YMODEM_NAK; } // 接收数据包 for (i = 0; i < YMODEM_MAX_SIZE; i++) { ret = ymodem_get_char(&data[i]); if (ret != YMODEM_ACK) { return YMODEM_NAK; } } // 校验数据包 if (data[YMODEM_MAX_SIZE - 2] != ymodem_calc_checksum(data, YMODEM_MAX_SIZE - 2)) { return YMODEM_NAK; } // 处理数据包 if (data[0] == YMODEM_SOH) { size = 128; } else { size = 64; } // 数据包序号为0时表示结束 if (data[1] == 0x00) { // 发送确认结束命令 for (i = 0; i < 3; i++) { ret = USART_SendData(USART1, YMODEM_ACK); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } break; } // 写入Flash ymodem_write_flash(&data[3], size); // 发送确认命令 for (i = 0; i < 3; i++) { ret = USART_SendData(USART1, YMODEM_ACK); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } return YMODEM_ACK; } ``` 该示例代码实现了一个Ymodem协议的文件接收程序,可以将接收到的数据包写入Flash中。在主函数中,先尝试接收APP1,如果接收成功则重启执行APP1;如果接收失败则尝试接收APP2,如果接收成功则重启执行APP2。如果两个APP都接收失败,则程序将被卡在while(1)循环中,等待重新启动。 在使用该示例代码时,需要在USART1的RX和TX引脚上接上一个串口转USB模块,并将该模块连接到PC上。然后,在PC上使用Ymodem协议的传输工具发送.bin文件即可。 需要注意的是,该示例代码只是一个简单的示例,实际使用时还需要根据具体的应用场景进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值