STM32F407 Bootloader Ymodem 协议实现
STM32F407 Bootloader Ymodem 协议实现
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些。下文中的bootload就来实现这样的功能。
根据Ymodem协议,实现了一个STM32F407的Bootloader,该Bootloader能使用SecureCRT8中的Send Ymodem协议进行固件的升级,如下图所示:

YModem协议:
YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。下面有一些相关的文档。这里要感谢关注我微博的一些朋友提供的资料。省去了不少时间。
下面先看下YModem协议传输的完整的握手过程:先看下图

SENDER: 发送方。
RECEIVER: 接收方。
第一步先由接收方,发送一个字符'C'
发送方收到'C'后,发送第一帧数据包,内容如下:
SOH 00 FF Foo.c NUL[123] CRC CRC
第1字节SOH:表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024
第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。
第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。
第4字节到最后两字节之前:若第1字节为SOH时有128字节,为STX时有1024字节,当为第0帧时,Data区包括要传输的文件名和文件的长度,它们均以字符串表示 比如“Foo.c” 为文件名,文件名字符串以0结束,文件长度字符串以空格结束,其余以0填充。
最后两字节:这里需要注意,只有数据部分参与了CRC校验, 它们不包括头和编码部分。16位CRC效验,高字节在前,低字节在后,这个主要用于校验每包传输的数据正确性。
接收方收到第一帧数据包后,发送ACK正确应答。
然后再发送一个字符'C'。
发送方收到'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。
接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。
数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。
发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。
最后接收方再发送一个'C',发送方在没有第二个文件要传输的情况下,
发送如下数据
SOH 00 FF 00~00(共128个) CRCH CRCL
接收方应答ACK后,正式结束数据传输。
以上部分,为YMODEM协议的基本操作流程。
STM32 Bootloader软件设计
1、怎么分配bootloader和app的空间
因为我用的是STM32F407,它的flash的大小是1M,分成如下方案:
0x08000000 --- 0x8004000 4000分配给bootloader使用,大小是16k;
0x08004000 --- 剩余部分分配给APP的使用。
IAP程序keil配置如下图所示:

APP程序keil配置如下图所示:

另外在APP程序必须要注意向量表的配置,比如我的APP从0x8004000开始,那么我需要做以下设置:


程序结构可以参考官方的Demo,记得加上CRC16校验,官方版本没有对传输的数据包进行校验,存储错传的风险。如下图所示

本文部分参考:https://www.cnblogs.com/hiker-blogs/archive/2013/03/17/stm32.html
浙公网安备 33010602011771号