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

 

posted @ 2018-04-26 23:41  -Robot-  阅读(1810)  评论(0)    收藏  举报