Xmodem Bootloader
了解更多关于bootloader 的C语言实现,请加我Q扣: 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单片机系统在线升级。