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 ...
随机推荐
- 如何用java写出无副作用的代码
搞java的同学们可能对无副作用这个概念比较陌生,这是函数式编程中的一个概念,无副作用的意思就是: 一个函数(java里是方法)的多次调用中,只要输入参数的值相同,输出结果的值也必然相同,并且在这个函 ...
- (转) The major advancements in Deep Learning in 2016
The major advancements in Deep Learning in 2016 Pablo Tue, Dec 6, 2016 in MACHINE LEARNING DEEP LEAR ...
- 在Mac上使用vim的几个命令
Mac上面编辑文件的命令总是记不住,留一个参考!!! 如果是vim,则:Esc 退出编辑模式,输入以下命令: :wq 保存后退出vi,若为 :wq! 则为强制储存后退出(常用) :w 保存但不 ...
- CentOS常见问题
1.图形界面无法启动 检查messagebus服务是否为开机启动:chkconfig --list messagebus 如果状态为不启动,则修改之:chkconfig messagebus on 启 ...
- Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference
最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...
- python 中__name__ = '__main__' 的作用
有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用 ...
- C# 读取和配置IniFile
自定义IniFile操作类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 【学】jQuery的源码思路6——增加each,animaion,ajax以及插件机制
each() 插件机制 animation ajax //each() //这里第一个参数指定将this指向每次循环到的那个元素身上,而第三个参数element其实就是this本身所以和第一个参数是一 ...
- javascript的一点学习
最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义. 记录一个比较有意思的bug: 目标是对一个全局的paramList进行json格式化显示.代码借鉴了 http: ...
- 基于Angularjs+jasmine+karma的测试驱动开发(TDD)实例
简介(摘自baidu) 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.它要求在编写某个功能的代码之前先编写测试代码,然 ...