Xmodem Bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。
多年前玩Cisco交换机时,更新交换机操作系统就是使用超级终端的XMODEM传送功能发送BIN文件到交换机。当时感觉使用XMODEM发送BIN文件更新系统,简单可靠又实用,虽然没有TFTP速度快,但TFTP需要设置IP,子网掩码,需组网,甚至需关闭防火墙。XMODEM简单方便不少,只需接上PC的串口就可以。一直想给我的单片机学习板写个XMODEM BOOTLOADER程序,然后也像Cisco交换机那样通过XMODEM发送BIN文件来升级应用程序。直到半个月前才开始动手,最近才完成。我发现XMODEM BOOTLOADER实现简单,非常适合给单片机这种存储空间有限的系统在线升级。虽然XMODEM不快,但由于单片机系统的BIN文件也不太大,所以速度也不是问题。在介绍我的XMODEM BOOTLOADER前先简单介绍下XMODEM协议。
XMODEM协议
XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。XMODEM传输是由XMODEM接收方发起的,通过发送NAK 信号或‘C’ (这里NAK不是报错,我叫它发起帧)来发起XMODEM传输(注意,NAK或‘C’决定之后XMODEM发送方是采用垂直累加和校验checksum,还是采用CRC-16校验)。发送方收到后,开始发送数据帧和其他控制帧。发送数据帧时,XMODEM文件发送方将文件分解成128字节的定长数据块,每发送一个数据块,等待对方应答后(ACK信号)才发送下一个数据块,数据校验采用垂直累加和校验(checksum),也可以采用CRC-16校验。属于简单ARQ(自动请求重发)协议,所以也适合于2线制的半双工的RS485网络中使用。
XMODEM发送的每个帧都有控制字符,并且只有以SOH开头的帧后面有数据,可以称为数据帧,其他帧都是单字符帧,每个帧都只有一个除SOH外的控制字符,包括应答帧(ACK),报错帧(NAK),结束帧(EOT),以及取消帧(CAN)。控制字符符合 ASICII 标准定义,长度均为 1 字节
SOH 0x01
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
这里介绍标准XMODEM数据帧的格式(数据校验为checksum校验):
| SOH | 信息包序号 | 信息包序号的反码 | 数据区段 | 算术校验和 |
|_____|________ |______________|________|__________|
说明:
SOH: 帧的开头字节,代表数据帧中的第一个字节
信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1,而信息包序号范围0~255。
信息包序号的反码: 当前信息包号的发码
数据区段: 数据区段的长度固定为 128 字节,其内容没有任何限制,可以是文本数据或二进制数据。如果最后一帧数据不满128字节,则使用0x1A填充剩余的空间
算术校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得。
XMODEM BOOTLOADER
我的XMODEM BOOTLOADER是用C语言写给我的PIC学习板用的,上电后,XMODEM BOOTLOADER首先传送发起帧(NAK信号)给PC端超级终端,如果10秒后对方还没有发送第一个数据帧,则重复发送“NAK”,这种重复次数最多允许10次,仍然没有收到第一个数据帧,则退出本次通信,直接跳转到应用程序。如果收到数据块,则确认数据块序号及其反码,接收数据,确认校验和,如果有问题就返回报错帧,都没问题就烧写数据到对应的地址上,再返回应答帧(ACK)。接着接收下一个数据块,直到接收到结束帧,最后返回应答帧后,跳转到新的应用程序中去。之间如果收到取消帧,也会发送应答帧,然后退出本次通信。
XMODEM BOOTLOADER接收到的数据都是BIN数据,但是PIC 编译完成后生成的是Hex文件,所以我用C#写了个程序运行在PC上,将Hex文件转换成BIN文件。界面如下:

XMODEM SEND
XMODEM SEND 发送BIN文件,我用的是超级终端。其实我之前写过也用超级终端传送数据来升级程序的PIC bootloader, 有四款分别是写给PIC16F, PIC18F, dsPIC33, PIC32MZ的。但是那是用的SEND ASCII的方式,没有任何协议,没有应答机制,所以显的不是很可靠,但用来学习还是很不错的。下面是这四款PIC bootloader的链接。
PIC16F:http://www.cnblogs.com/geekygeek/p/hyperbootloader_pic16.html
PIC18F:http://www.cnblogs.com/geekygeek/p/hyperbootloader_pic18.html
dsPIC33:http://www.cnblogs.com/geekygeek/p/hyperbootloader_dspic.html
PIC32MZ:http://www.cnblogs.com/geekygeek/p/hyperbootloader_pic32.html
现在我将这四款PIC bootloader都改良为XMODEM bootloader,升级PIC target时使用超级终端的XMODEM SEND传送BIN文件。首先在超级终端“发送”菜单栏里选择“发送文件”,然后选择BIN文件,选择Xmodem协议。最后点击发送。重启带有XMODEM bootloader的单片机系统,XMODEM bootloader就会发起传输,然后超级终端开始传送数据,很快就完成在线升级程序,就像复现了当初升级Cisco交换机时的场景。我试了用SecureCRT的XMDOEM SEND发送BIN文件,同样可以和我的XMODEM BOOTLOADER协同工作,完成PIC单片机系统在线升级。


Xmodem Bootloader的更多相关文章
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- Encrypted bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- [源创] STM32F103ZET6 基于XMODEM 通讯的 BOOTLOADER案列IAP
网上好多初学者 都想知道如何更好的用IAP,BOOTLOADER 功能 我给大家一个我自己的基于Xmodem的例子, 开发环境 KEIL 5.14 + STD标准库 芯片 STM32F103ZET6 ...
- bootloader(转)
本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软件设计的主要任务以及结构框架等内容. 1. 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得 ...
- BootLoader 详解(1)
1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...
- 【转】Bootloader之uBoot简介(转)
原文网址:http://blog.csdn.net/sadamoo/article/details/8139946 来自http://blog.ednchina.com/hhuwxf/1915416/ ...
- Stm32 Bootloader整理
Stm32 Bootloader整理 一. 基本概念 1.IAP IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User ...
- AVR之BOOTLOADER技术详解(转)
源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...
- stm32 Bootloader设计(YModem协议) (转)
源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...
随机推荐
- Yii2 利用controllerMap自定义控制器类
版权声明:本文为博主原创文章,未经博主允许不得转载. Yii2框架为我们自定义好的 controllers,Models,views,标准的MVC结构框架,但是有些时候我们写接口希望结构更加清晰而不 ...
- Oracle 备份与还原
oracle 备份与还原 一.备份数据库(exp) 1.完全备份 exp demo/demo@orcl buffer=1024 file=d:\back.dmp full=y demo:用户名.密码 ...
- SQL存在一个表而不在另一个表中的数据, 更新字段为随机时间
--更新字段为随机时间 86400秒=1天 UPDATE dl_robot ), ,GETDATE()) ) SQL存在一个表而不在另一个表中的数据 方法一 使用 not in ,容易理解,效 ...
- 关于CPLD与FPGA的对比分析
1.PLD/FPGA/CPLD PLD(Programmable Logic Device):可编程逻辑器件,数字集成电路半成品,芯片上按照一定的排列方式集成了大量的门和触发器等基本逻辑元件,使用者按 ...
- 非阻塞socket调用connect, epoll和select检查连接情况示例
转自http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html 我们知道,linux下socket编程有常见的几个系统调用: ...
- MongoDB的下载与安装
MongoDB的下载与安装 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系 ...
- Android 卡片计数器
该文用英文写的,可以到我的英文博客中阅读.
- 动态linq to list排序
public class QeurySort { public static IList<T> Sort<T>(IList<T> list,string sidx, ...
- 大气散射 GPU Gems2 Chapter 16. Accurate Atmospheric Scattering
效果图 这次先上效果图*4 散射概念 光线击中空气中的微小颗粒后的偏折导致了光线的散射.我们看到的阳光应该是由视线上的散射在视线方向上的集合.如果由地面的反射,还要加上经过散射计算的地面反射. Ray ...
- module
扯淡的人 http://www.cnblogs.com/yuanchenqi/articles/5732581.html 不被调用的 要写在这下面 1 if __name__=="__ ...