Ymodem协议(参考STM32)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些。下文中的bootload就来实现这样的功能。
前段时间有项目关于Bootload设计。所以就仔细的去了研究了一翻。以前都是用的stm32官方的,没有去深入了解。这次做完了过后,发现官方的版本存在一些问题。比如说YModem传送过程中,完全没有对数据区进行效验,只是核对了下编号,就进行烧写。整个程序完全为阻塞式,浪费了大量的cpu做无用功。当然这在升级程序方面也用不了多少时间。有一个重要的问题,官方代码只可以用超级终端进行传输。这样如果你用的是64位的win7,那就没有办法升级。因为只有xp或32位的win7才可以使用 超级终端。64位的win7下超级终端没办法使用。 不过SecureCRT工具到是可以在64位win7使用,但是官方代码不对其支持。SecureCRT下支持的是最原始的YModem协议,第一帧数据包中不包含总字节数。超级终端下的YModem应该是改进版的,所以官方的dome只可以在超级终端下传输。下面会对YModem进行详细说明。就会知道其中的原因。
首先奉上一个精简的Bootloader工程。
http://pan.baidu.com/share/link?shareid=373630&uk=118334538
支持协议:YModem, YModem-G。
所支持的PC软件:超级终端,SecureCRT。
http://pan.baidu.com/share/link?shareid=373637&uk=118334538
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字节,这部分为数据区。“Foo.c” 文件名, 超级终端下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。
在文件名和文件大小之后,如果不满128字节,以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软件设计
笔者一开始软件的基本思想,串口接收数据,和写数据到ROM中,两者可以同步进行。这样可以让cpu得到最大程度的有效利用。
比如说接收一帧1024的数据,所用的时间= 当前波特率单字符所用时间 * (1024 + 1头 + 2编码 + 2CRC)= (1/115200 * 10) * (1024 + 1 + 2 + 2) = 89.323ms
也是就是,在接收的这90ms左右的时间里,在接收下一帧结束这一期间内,可以把上一帧的数据写入到ROM中。 串口接收数据是中断的方式,所以收写操作基本上算同步运行。程序流程如下

STM32 Bootloader使用方法:
这个STM32 Bootloader程序使用起来很简单,如果你以前没有用过IAP升级方式,也没关系下面会详细说明。
准备工作:
硬件:有串口目标板1,串口连接线。
软件:PC工具:超级终端 或SecureCRT,stm32目标板程序.bin,stm32 Bootloader。
1) 先把上面的工程stm32 Bootloader下载到目标板中;
2) 打开超级终端 或SecureCRT,设置波特特115200,停止位1,数据位8,效验无。
3) 先按下‘C’再给目标板上电;(注意先后顺序)
4) 选择1,然后使用YModem, YModem-G协议发送"stm32目标板程序.bin"文件。
5) 传输完毕后,会自动运行。
注意:以下两处根据自己的需求调整
stm32 Bootloader修改:
找到工程下的common.h文件:
以下三个宏定义根据自己目标板的需求来定:
#define ApplicationAddress 0x8002000 //程序首地址
#define ApplicationSize 120000 //目标程序预留空间
#define STM32F10X_HD //目标板芯片类型
stm32目标板程序.bin偏移地址修改:
有两个地方:
1找到system_stm32f10x.c
#define VECT_TAB_OFFSET 0x2000 /*!< Vector Table base offset field.

Ymodem协议(参考STM32)的更多相关文章
- stm32 Bootloader设计(YModem协议) (转)
源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...
- ZYNQ使用ymodem协议传输文件
SDK: V2014.4 协议: Ymodem 工具: USB转UART转接线.xshell6软件 可实现各种文件传输,大小不限,只是速度很慢 参考原代码如下: /****************** ...
- YModem协议
源:YModem协议 YModem协议: YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议. 下面先看下YModem协议传输的完整的握手过程: ...
- ymodem协议c实现(转)
源:ymodem协议c实现 /****************************************Copyright (c)******************************** ...
- Ymodem协议说明
模块的固件烧录过程,由Term(发送方)发送固件文件,模块(接收方)接收并写入MCU,期间使用的数据传输协议是ymodem协议. 一.概述 ymodem协议是一种发送并等待的协议,即发送方发送一个 ...
- dubbo协议参考手册(转)
原文链接:http://wely.iteye.com/blog/2331332 协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dub ...
- python调用Moxa PCOMM Lite通过串口Ymodem协议发送文件
本文采用python 2.7编写. 经过长期搜寻,终于找到了Moxa PCOMM Lite.调用PCOMM.DLL可以非常方便的通过串口的Xmodem.Ymodem.Zmodem等协议传输文件,而无需 ...
- 移植mavlink协议到STM32详细教程
1准备材料, 首先准备一个带串口的stm32程序(这里选用整点原子的官方串口例程这里自己去找不讲)作者:恒久力行 QQ:624668529,然后去mavlink官网下载mavlink源码,这里重点讲解 ...
- adb概览及协议参考
原文:https://github.com/android/platform_system_core/blob/master/adb/OVERVIEW.TXT) Implementation note ...
随机推荐
- Java中通过Class类获取Class对象的方法详解
方式1:通过Object类的getObject()方法 Person p = new Person(); Class c = p.getClass(); 方式2: 通过 类名.class 获取到字节码 ...
- PO模型
大神绕道而行,自我小白的笔记,仅此 一.创建文件夹,创建xxx.ini文件用来存放界面的定位元素,用 [界面_element]-->界面, 来划分界面界面元素,维护方便.定位元素的格式: us ...
- Navicat Premium 安装与激活破解版简单操作 (原)
首先下载navicate程序以及破解文件,这里一并存到了百度网盘直接下载即可 链接:https://pan.baidu.com/s/11ptFmsV1o3B5oB00zm2NdQ 密码:yw82 解压 ...
- HTML5中的audio在手机端和 微信端的自动播放
再做H5页面的时候,发现audio在手机端和微信端添加了autoplay以后还是不可以自动播放,这是因为手机端为了节约流浪所设置的 通常解决方法是给一个交互事件,一定要是交互事件 标签:<aud ...
- ssh简单入门级案例教程
准备工作:struts2.3.34+spring4.2.2+hibernate3.3.2 导入需要的开发包: struts开发包---注意:javassist-3.18.1-GA.jar包与hiber ...
- beego 初体验 - orm - 增删改查
本文记录一下 beego orm 简单的增删改查,大牛请绕道. 首先,注册4个增删改查的路由: 其次,在 views 文件夹下增加对应的模板(页面): controller 类里写上增删改查的方法: ...
- laravel更改默认的登录密码加密方式
laravel更改默认的登录密码加密方式 laravel 默认用的登录密码加密方式是: $password = Hash::make('password'); 而我平时用的密码加密方式是: $pa ...
- python拼接变量、字符串的3种方法
第一种,加号(“+”): print 'py'+'thon' # output python str = 'py' print str+'thon' # output python 第二种 ,空格: ...
- scrapy yield
生成器 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环 ...
- 《大话设计模式》c++实现 模版方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 角色: (1)AbstractClass:是抽象类,其实也 ...