随着嵌入式系统在各行各业中的广泛应用,设备的固件升级成为维护和功能增强的重要环节。
本文将详细分析和设计一种串行下载协议,以期为开发人员提供清晰、易操作的技术指南。
在串行下载协议中,数据传输包的结构至关重要。通信采用变长帧结构,大端模式,用于确保数据的正确性和完整性。
以下是数据包的各个组成部分:
串行下载协议定义了多种命令,常见的命令包括擦除命令、写入命令、验证命令等。以下是每个命令的详细参数介绍:
1
擦除命令(E)
擦除命令用于擦除指定地址范围内的Flash存储器。
2
写入命令
写入命令用于将数据写入指定的Flash存储器。
3
验证命令(V)
验证命令用于验证存储器中某页的内容是否正确。
4
远程复位命令(R)
远程复位命令用于执行设备的软复位操作。
5
校验和与命令应答机制
协议中的校验和字段用于验证数据包的完整性。校验和通过对所有字段(除起始ID外)进行二进制补码求和获得。
加载器根据校验和的结果判断数据是否正确。
命令应答:
- ACK(0x06):表示命令成功执行。
- BEL(0x07):表示命令执行失败,通常是由于校验和错误或地址无效。
6
典型升级流程(实现步骤)
基于上述协议,一个完整的固件升级流程应如下所示:
- 准备: 主机(上位机)拉低目标MCU的下载模式GPIO引脚 。
- 启动: 主机通过硬件或软件方式复位目标MCU 。
- 同步: 主机向目标MCU发送同步字符 0x08。
- 握手: 主机等待并接收24字节的ID包,验证目标是否正确 。
- 擦除: 主机发送擦除命令 ('E')(通常是批量擦除)。
- 确认: 主机等待加载器回复 ACK (0x06)。
- 写入: 主机将固件(.bin或.hex文件)分块(例如,每包250字节),循环发送写入命令 ('W')。
- 确认: 每发送一个写入包,都必须等待一个 ACK (0x06)。
- 校验 (推荐): 固件全部写入后,主机应逐页发送验证命令 ('V'),以确保数据完整性。
- 释放引脚: (关键步骤) 主机释放下载模式GPIO引脚(使其恢复高电平或浮空状态)。
- 重启: 主机发送远程复位命令 ('R')。
- 完成: 目标MCU重启,进入新的主应用程序。
分析完这个协议,我们可以看到一个成熟的工业级协议是如何在简单与可靠之间做取舍的。对于正在设计私有IAP协议的工程师来说,自动波特率、补码校验以及非回读式验证,都是非常值得直接复用的设计模式。
我要赚赏金
