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 ...
随机推荐
- Jmeter基础之---jmeter基础概念
Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...
- jquery筛选器
1.过滤 eq(index|-index) 获取当前链式操作中第N个jquery对象,正数从0开始,负数从-1开始. first 获取当前链式操作中第1个jquery对象 last 获取当前链式 ...
- Android 增量更新(BSDiff / bspatch)
Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...
- expr命令的一些用法
expr是evaluate expressions的缩写,我的理解它的作用就是用来输出表达式的值. 看下面的几个例子. (1)进行数值运算 $:expr 1 + 2 //'+' 左右两边必须有 ...
- MyBatis与Spring整合
1.单独使用MyBatis 单独使用MyBatis,不结合其他框架,主要步骤是: 1.创建SqlSessionFactory对象 创建方法是通过SqlSessionFactoryBuilder这个类从 ...
- Java lamda Stream
Intermediate:一个流可以后面跟随零个或多个 intermediate 操作.其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用.这类操作都是惰性化的( ...
- Microsoft JScript 运行时错误: '$' 未定义
在运行MVC Music Store时Visual Studio 捕捉到此错误: Microsoft JScript 运行时错误: '$' 未定义 可能是引用的Scripts 引用出错,检查当前文件中 ...
- Index was outside the bounds of the array. (Microsoft.SqlServer.Smo)
本地ssms是 安装Sqlserver 2008 r2 自带的 远端的server是sqlserver2014 可以连接,可以执行查询语句.但是,不能使用ssms生成对象的脚本.推测ssms 2008 ...
- three.js学习笔记
一.名词解释 scene - 场景 camera - 摄影机 renderer - 渲染器:描绘器 Vector - 三维向量的对象 orthographic - 正射 field of view - ...
- 如何用Jupyter Notebook打开Spark
电脑已经装了anaconda python,然后下载了spark2.1.0.因为版本太新,所以网上和书上的一些内容已经不再适用.比如关于如何使用IPython和Jupyter,教程给出的方法是用如下语 ...