一、前言

本章以“串口IAP”来讲解IAP的实现过程。因此,在这里讲一下,具体通过怎样的技术与协议,来把“固件”文件传递到芯片的bootloader中。

串口通信方式与参数约定
可以使用“RS232”或“RS485”来组成通信链路。串口通信参数约定如下:

  • 波特率:57600
  • 数据位:8bits
  • 校验:None
  • 停止位:1 bit

二、协议约定

  1. 协议规则
    CRC校验码 = [命令类型码 + 命令码 + 命令参数]
    一个完整封包 = [包头 + 包长 + 命令类型码 + 命令码 + 命令参数 + CRC校验码 + 包尾]
    包头:FF
    包尾:E3 D1 AC B5
    包长:0A (除去包头和包尾的长度,最长256)
    命令类型码:01:下发数据命令,02:获取数据命令,03:下位机主动反馈命令
    命令码:08
    命令参数(长度可变):00 11 22 33 …
    CRC校验码:E32F
    注:方括号和空格只为格式化显示,并不实际包含在封包中。
    封包最长长度为:131 + 1 + 4 + 3 + 2 = 141

  2. CRC校验算法

void GetCRC(uint8_t *data, int16_t len, uint16_t *crc) {uint16_t i,j,carry_flag, temp;*crc = 0xffff;for (i = 0; i < len; i++) {*crc = *crc ^ data[i];for (j = 0; j < 8; j ++) {temp = *crc;carry_flag = temp & 0x0001;*crc = *crc >> 1;if (carry_flag == 1) {*crc = *crc ^ 0xa001;}}}
}
  1. 传输错误的处理方法
    使用失败重试机制,具体实现细节描述如下:
    通信错误的时候,下位机不会给给上位机返回“反馈命令”。
    上位机发送命令后等待接收“反馈命令”,如果等不到,则重发刚才的数据包。
    重发3次失败后,软件提示“下载失败”。

  2. 协议设计思想说明
    4.1 这里把封包设计的这么小,其目的在于让这个协议适用于多种“数据传输通道”,包括:串口、蓝牙、Socket、CAN、USB、Zigbee、其他任何无线通信。同时封包比较小,当遇到错误重发某个包的时候,代价相对较小可以接受。 另外,由于有封包的设计,因此接收数据封包方,需要定义一个接收缓存数组来接收完整的一包数据,然后进行校验计算。所以这个封包大小不能太大,否则MCU可能没有这么大的RAM可用。
    4.2 另外给协议加入了crc校验算法,目的是保证通信数据正确,避免数据传输出错。从而提高整个固件下载系统的稳定性。当你使用串口通信等稳定的通信链路来传输数据的时候crc校验显得有些多余。但是当你使用无线通信的时候,这个crc就是必不可少的校验机制。
    4.3 crc校验算法,采用了“计算法”而不是“查表法”。是因为考虑到特殊的芯片,并没有太多的代码储存空间,因此采用“以CPU计算量换储存空间”的策略。

三、命令列表

命令使用简单整体描述:
电脑PC工具先用“握手命令”确认Bootloader的正确存在。
使用“下载开始”命令告诉芯片准备接收下载数据,Bootloader完成擦除Flash。
使用“下载数据”命令下载数据,bootloader把收到的数据写入到Flash中。
使用“固件校验”命令确认下载到flash中的bin文件和要下载的bin文件“完全一至”。
使用“下载结束”命令告诉芯片下载完成了,可以校验app并重启芯片了。

  1. 下载固件握手命令:
    功能备注:主要用于上位机下载工具,实现自动查找设备的功能。
    命令类型码:01
    命令:01
    参数:无
    反馈命令:
    命令类型码:01
    命令:01
    参数:01 //版本序号(1,2,3,4,5等)

  2. 固件下载开始命令:
    功能备注:用于告诉bootloader要开始下载固件了,请做好准备。准备的内容包括,擦除要烧写固件的flash区域。准备好之后,给上位机反回“反馈命令”即可。
    命令类型码:01
    命令:02
    参数:无
    反馈命令:
    命令类型码:01
    命令:02
    参数:无

  3. 件下载结束命令:
    功能备注:用于上位机下载工具,告诉bootloader下载已经完成(之前的校验也成功了,如果不成功是不会发送此命令的),可以写“App存在”的flag到flash中了,同时可以跳转到烧写好的app并运行app了。
    命令类型码:01
    命令:03
    参数:无
    反馈命令:
    命令类型码:01
    命令:03
    参数:无

  4. 固件下载数据命令:
    功能备注:用于传输要烧写的bin文件到bootloader中,bootloader按页依次写到flash中。
    命令类型码:01
    命令:04
    参数:数据分片序号(2byte,高位在前 ) + 是否为最后一片(1byte)+需要下载的数据(约定为固定大小128byte)下载8个分片可以组成flash的一页128*8 = 1024
    反馈命令:
    命令类型码:01
    命令:04
    参数:无

  5. 固件校验命令:
    功能备注:用于校验所下载到flash中的固件文件与原本的bin文件是“一致的”。用于检测下载是否正确完成。Bootloader校验之后,把结果反回给上位机。
    命令类型码:01
    命令:05
    参数:所下载固件的校验值:0x00, 0x00, 0x00, 0x00(4byte,高位在前 )+ 分片总数(4byte,高位在前)
    反馈命令:
    命令类型码:01
    命令:05
    参数:0:错误,1:正确

四、协议代码实现说明

协议相对很健壮,因此看起来感觉很复杂,不容易实现。其实这个协议是我在实际项目开发中,总结设计出来的一套协议模板。对应于这个协议,我已经设计并实现了一套对应的“协议数据处理框架”。在本书3.1、3.2、3.3章节进行过详细的说明。当时是使用“网络通信”举例来说明“协议框架”的实现代码。这次借助“串口IAP”的应用场景,完成一个“协议框架”的“串口通信”编码示例。 具体的实现代码,请参考:13.4和13.6章节。

13.2-“制作一款私有IAP串口下载小工具”之串口IAP的通信协议设计相关推荐

  1. 【Unity2d】带你制作一款类似于金山打字的小游戏

    博主大概08年开始接触电脑游戏,当时玩的是我哥的电脑,那时候家里没网,只可以玩电脑上自带的单机游戏,比如扫雷.蜘蛛纸牌等等,当然还有红色警戒.冰封王座.星际争霸.帝国崛起等等,这些大概是我哥当时在大学 ...

  2. Qt实现串口通信(C++实现串口通信小助手)---串口收发及串口数据解码、串口通信模拟器。

    Qt实现串口通信示例 前言:以下串口通信示例,参考了现有网上前辈们的资源,最后结合部分个人的思想,所以下述博客会将实现的原理及代码的案例进行公开. 这里我们先上效果图: 一.串口通信简介 串口通信是上 ...

  3. 分享四款吾爱破解热门小工具

    前言 又来给大家推荐一些乱七八糟的小工具了 最近找到几款感觉不错的 小编非常喜欢收集各类小工具的,虽然功能比较单一,但小巧实用~ 希望你们喜欢 LosslessS caling LosslessS c ...

  4. 女友的生日礼物能随便嘛?Python小妙招:制作一款出圈九宫格抽奖小程序。

    导语 上一期文章是写的九宫格切图,都说很好看~朋友圈的九宫格也大受欢迎! 其实吧:最近女朋友要生日了,我问她要什么吧,她就说"随便",我这一想,顿时恼火啊,说随便,但是当男朋友的也 ...

  5. 收藏!5款超级好用的小工具推荐,各个都是同类软件中的翘楚

    今天要给大家推荐的是5款软件,每个都是同类软件中的个中翘楚,请大家给我高调的使用起来,不用替我藏着掖着. 1.Excel表格插件--EasyCharts 这是一个超级好用的Excel插件,能够帮我们一 ...

  6. 自制串口示波器小工具

    因为博主喜欢玩嵌入式,经常与各种硬件打交道,常常需要采集下位机的信号,无奈学生党,买不起示波器,自己用python写了一个串口示波器的上位机,可以很简单的和下位机配合组成示波器,效果如图: 打包exe ...

  7. 【定制开发】【M8】推荐一款强大的磁盘清理小工具,专治磁盘爆满(不到1M)

     工具下载:foldersize.zip-其它文档类资源-CSDN下载 今天打开电脑,发现磁盘已经红色警告了...所以电脑速度真的是太感人了! 要把吃磁盘的罪魁祸首抓出来,想起来朋友前些日子聊天时力荐 ...

  8. 串口监听工具listen_串口命令解析

    第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...

  9. 一个用于制作Windows指针inf安装文件的小工具。

    不用多说也都知道鼠标inf安装文件的重要性,没了inf就算你的指针再美观,一个一个替换也会吓跑很多很多的人,于是做了这个小软件. 软件地址:Cursor INF Tool v1.3.rar - 蓝奏云 ...

  10. 五款非常轻便的实用小工具

    大伙们,开工大吉! 1.系统清理--WiseCare365 WiseCare365是由WiseCleaner开发的一款用来管理,维护,配置以及解决电脑故障的适用于Windows操作系统的电脑的免费软件 ...

最新文章

  1. TX Text Control文字处理教程(13)实现拖放操作
  2. 《Angular4从入门到实战》学习笔记
  3. Ubuntu16.04 配置vnc4server
  4. maven与spring_与Spring和Maven签约首个SOAP服务
  5. 本人计划继续写飞鸽传书,支持的人有吗?
  6. Js中Symbol对象
  7. python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法...
  8. pku 2976 Dropping tests 01分数规划
  9. 数据库添加字段sql语句
  10. 谷歌浏览器误删临时用户恢复书签
  11. 个人博客系统的设计与实现
  12. python音频合成_音频拼接的简单实现方法(python一种,java两种)
  13. 解决非硬件问题导致的U盘总容量大幅减少
  14. 海阔凭鱼跃 天高任鸟飞-大上海,人人都向往的城市
  15. 【测验1 编程题】: Python基本语法元素 (第1周)
  16. 《沉默的云》.读书笔记(二)
  17. 【暑期每日一题】洛谷 P6320 [COCI2006-2007#4] SIBICE
  18. ⭐算法入门⭐《堆》中等01 —— LeetCode 面试题 17.09. 第 k 个数
  19. 频繁跳槽写入简历的三条原则!
  20. freeline集成

热门文章

  1. 云端卫士实战录 React + Redux 前端项目实践
  2. springboot配置logback
  3. ESP8266 WIFI kill 2021版教程(小白0基础)
  4. Codewars-Java编程刷题学习4-Jaden Casing Strings
  5. 不要轻易在简历上写我热爱编程,我热爱学习—兄弟连IT教育
  6. MIT CMS.300 Session 3 – DIGITAL ENVIRONMENTS GAMES 数字环境与游戏
  7. unity显示no camera rendering
  8. 输入一个小写,输出大写字母
  9. audio autoplay无效的问题
  10. 药品计算机系统操作知识培训,新版GSP:计算机系统专业知识培训测试题(6)