当前位置: 首页 > news >正文

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.

 

转载于:https://www.cnblogs.com/Ph-one/p/10362414.html

相关文章:

  • android uboot中的mmc命令
  • stm32最简单的实现BootLoader
  • 变参标准函数的重新封装,如printf
  • 导数与梯度
  • linux /Android 平台下使用 i2c-tools
  • 在android下使用i2c tools
  • ubuntu查看文件和文件夹大小
  • matlab的三维绘图和四维绘图
  • Matlab绘制三维曲面(以二维高斯函数为例)
  • VSCode 预览 .md 文件
  • 右侧添加悬浮打赏功能
  • Git错误non-fast-forward后的冲突解决
  • linux物理网卡检测命令mii-tool
  • HTML !--...-- 标签
  • Linux下查看网卡驱动和版本信息
  • [译] 怎样写一个基础的编译器
  • CSS 专业技巧
  • E-HPC支持多队列管理和自动伸缩
  • golang中接口赋值与方法集
  • java多线程
  • java中具有继承关系的类及其对象初始化顺序
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • STAR法则
  • uva 10370 Above Average
  • 阿里云Kubernetes容器服务上体验Knative
  • 京东美团研发面经
  • 日剧·日综资源集合(建议收藏)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 突破自己的技术思维
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 消息队列系列二(IOT中消息队列的应用)
  • python最赚钱的4个方向,你最心动的是哪个?
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (2)STM32单片机上位机
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)(3.5) 遥测无线电区域条例
  • (4)STL算法之比较
  • (ZT)薛涌:谈贫说富
  • (三)uboot源码分析
  • (十八)三元表达式和列表解析
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .form文件_SSM框架文件上传篇
  • .Mobi域名介绍
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net mvc部分视图
  • .net 生成二级域名
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法