了解更多关于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的更多相关文章

  1. Encrypting bootloader (程序BIN文件加密及在线升级)

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...

  2. Encrypted bootloader (程序BIN文件加密及在线升级)

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...

  3. [源创] STM32F103ZET6 基于XMODEM 通讯的 BOOTLOADER案列IAP

    网上好多初学者 都想知道如何更好的用IAP,BOOTLOADER 功能 我给大家一个我自己的基于Xmodem的例子, 开发环境  KEIL 5.14 + STD标准库 芯片 STM32F103ZET6 ...

  4. bootloader(转)

    本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软件设计的主要任务以及结构框架等内容. 1. 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得 ...

  5. BootLoader 详解(1)

    1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...

  6. 【转】Bootloader之uBoot简介(转)

    原文网址:http://blog.csdn.net/sadamoo/article/details/8139946 来自http://blog.ednchina.com/hhuwxf/1915416/ ...

  7. Stm32 Bootloader整理

    Stm32 Bootloader整理 一.        基本概念 1.IAP IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User ...

  8. AVR之BOOTLOADER技术详解(转)

    源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...

  9. stm32 Bootloader设计(YModem协议) (转)

    源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...

随机推荐

  1. 如何用java写出无副作用的代码

    搞java的同学们可能对无副作用这个概念比较陌生,这是函数式编程中的一个概念,无副作用的意思就是: 一个函数(java里是方法)的多次调用中,只要输入参数的值相同,输出结果的值也必然相同,并且在这个函 ...

  2. (转) 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 ...

  3. 在Mac上使用vim的几个命令

    Mac上面编辑文件的命令总是记不住,留一个参考!!! 如果是vim,则:Esc 退出编辑模式,输入以下命令: :wq  保存后退出vi,若为 :wq! 则为强制储存后退出(常用) :w    保存但不 ...

  4. CentOS常见问题

    1.图形界面无法启动 检查messagebus服务是否为开机启动:chkconfig --list messagebus 如果状态为不启动,则修改之:chkconfig messagebus on 启 ...

  5. 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 ...

  6. python 中__name__ = '__main__' 的作用

    有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用 ...

  7. C# 读取和配置IniFile

    自定义IniFile操作类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  8. 【学】jQuery的源码思路6——增加each,animaion,ajax以及插件机制

    each() 插件机制 animation ajax //each() //这里第一个参数指定将this指向每次循环到的那个元素身上,而第三个参数element其实就是this本身所以和第一个参数是一 ...

  9. javascript的一点学习

    最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义. 记录一个比较有意思的bug: 目标是对一个全局的paramList进行json格式化显示.代码借鉴了 http: ...

  10. 基于Angularjs+jasmine+karma的测试驱动开发(TDD)实例

    简介(摘自baidu) 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.它要求在编写某个功能的代码之前先编写测试代码,然 ...