完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、单片机在线升级原理
单片机程序在线升级功能对于产品的维护,软件问题解决,功能添加有着非常重要的地位,例如:设备安装位置拆卸不便场景(这种情况很常见)、产品密封有比较高的要求、设备灌胶的、附近存在危险的等等;另外对于大批量升级的场景,如果都采用人工通过烧录器的方式处理,一来客户抱怨大,二来成本费用高,三来周期长。对于大批量升级功能的实现本文再后部章节将重点介绍。 我相信各个工程师或者类似产品的企业都有上述困难,因此具备在线升级功能的程序就能够上场发挥其重要的作用了。顾名思义,在线升级就是通过芯片预留或者必须的通讯接口,通过特定的程序、通讯协议、升级设备、PC软件等,无需通过SW,JTAG的板载接口进行快速的程序刷入,并覆盖原先老程序,以达到程序维护的目的。 常规的单片机在线升级程序结构如下: 常规单片机要实现远程升级至少具备2个区域,即Boot和App两个区,对于没有外部EPRON的建议再片内模拟一个EPROM,用于升级相关信息的保存,这些信息将作为Boot和App之间通讯的桥梁,具体再第六个章节进行介绍。 根据上述结构,开发者需要再程序的开始位置设计一个"引导程序",即bootloader,后面简称boot。boot在上电时检测通讯接口是否存在升级消息,判定需要进入升级流程,否则直接跳转到用户程序区域,芯片开始运行用户程序。同样用户程序也需要具备升级消息判定能力,决定设备是否需要重新启动,以便让boot接管升级任务处理。先不着急,具体实现后面将根据升级过程的每个细节进行展开,由浅到深,带领大家了解每个环节的细节。 注意:开始位置并不代表就是地址0x0位置; 本文的升级教程适用于绝大部分单片机,原较旧的freescale的DZ96单片机因内存结构和芯片默认加载机制影响,需要对升级的固件额外进行地址转换外(有需要的可以下方留言),绝大部分单片机升级原理均通用。文章后面将以KEA128或者S32K144单片机进行介绍。 二、单片机flash分区介绍 根据章节一的要求,用户需要根据项目的工程量,芯片的片上的主存储资源,对芯片进行分区,下面以s32k144单片机进行介绍: s32k144的pflash空间为512K,首先在地址0x0开始的16K空间分配一个BOOT,紧挨着的分配一个系统运行的程序区域Run_App区域空间大小240K(非常大了),在Run_App的相邻位置分配一个Bak_App用于固件备份存储,大小也为240K;PARA_PAGEA/PARA_PAGEB为应用程序工作的参数下载或者存储的区域,替代EEPROM;UP_PARA为固件升级时产生的必要信息,空间4K,后面关于这个参数内容和作用会介绍。 到此为止,芯片的FLASH存储空间的分配已经完成,我们这里称他为分区,将来的程序空间必须严格按照改分配区域执行,这也是实现程序升级的基础和必须完成的工作。 三、IAP/Bootloader升级原理介绍 所谓程序升级,即:将有问题的,或者过时的程序进行替换;那么重点来了,谁来替换?我们如何实现程序替换?程序保存在哪里? 即开头三个"W",解决了这三个W,我们基本就已经掌握了程序升级的基本功了。 第一个W:谁来替换,当然时写在程序复位向量首地址,被我们赋予特定功能的一段小程序,由他实现通讯握手,数据接收,称他为BOOT; 第二个W:如何替换,当然我们这里需要实现一个Flash的驱动,通过Flash驱动程序,根据通讯协议将程序写入到ROM中; 第三个W:程序保存在那里,这个很关键,在第二个章节我们提到了分区的概念,那么我就直接说吧,程序最终应该保存在Run_App区域,只是在升级过程中为了防止断电,升级中断,升级超时因此设置了一个Bak_App,但程序完全接收完毕后,由Bak_App搬至Run_App中,当然搬运的过程也是Boot的职责。 大家应该了解,单片机编译完毕后一般生产的时hex,bin,S19文件,这里讲一讲区别: bin:连续地址空间的二进制数据,数据排列和ROM空间排列一致,升级需要从BIN文件的首地址开始,根据BIN文件的大小,按顺序写入到FLASH指定起始地址中; hex和S19文件:这是两个公司的可执行文件格式定义,一般这两个文件会比bin文件大很多,原因在于hex和S19文件会根据一定的格式封装可执行文件,Hex格式具体见如下连接: 下面将实际项目中使用的升级流程图分享给大家参考:
四、升级协议设计 协议:即通过一定的规则定义通讯的报文/数据包,实现数据传输的交互,大家可以直接参考以下连接的协议,本案例的实现也是按照该协议实现的。协议具体介绍文章中均有详细介绍。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:52 , Processed in 0.956987 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号