介绍了一种基于4G无线通信技术的单片机远程在线升级系统及方法,由上位机、4G无线模块、嵌入式设备终端3部分组成。
结合EC20 R2.1 4G模块,介绍了4G无线网络的组建方法,借助4G网络实现远程无线升级。
通过验证测试,系统能够实现嵌入式程序可靠、稳定地快速升级。
本设计特别适用于恶劣环境、偏远地区等特殊场合,可大大提高设备维护效率,降低维护成本,具有很高的应用价值。
嵌入式设备在使用过程中,经常因功能更新、缺陷修改、性能提升等原因需要进行升级。
程序升级的传统手段是维护人员亲赴现场烧写程序,如果设备应用在高温高湿、腐蚀、密闭空间、野外等恶劣偏远环境中,人工操作是很困难的。此外,传统手段速度慢、差旅费用高,尤其是当设备数量庞大、分布范围广时,耗费的成本是不可估量的。
随着无线通信技术的发展,GPRS、4G等应用越来越简单,本文提出基于4G无线网络的嵌入式程序IAP远程在线升级方案。
使用4G无线网络,无需现场布线,设备安装位置灵活,只要有4G信号覆盖即可,非常适合用于恶劣环境、设备量大、分布范围广等特殊场合。
IAP在线升级原理
对单片机进行编程,常用方式有JTAG、ISP、IAP等。
- JATG一般用于程序开发阶段在线调试。
- ISP需要依靠单片机厂商预先固化在片内的引导程序(Bootloader)通过串行外设等程序下载到存储器,这种方式需要通过更改硬件设置选择程序启动位置。
- IAP依靠用户自己的程序在运行中对单片机进行编程,不需要更改硬件设置,无人参与即可实现升级,具有更好的灵活性。
单片机实现IAP升级需要将片内存储器人为地分为两部分:一部分存储IAP程序,称为IAP程序区;另一部分存储正常的APP应用程序,称为APP程序区。
在STM32F103ZET6上实现IAP,需要将单片机配置为从Flash主存储器启动。
STM32F103ZET6的Flash存储器组织结构如表1所列,IAP程序放置在Flash基地址处(0x08000000)。在本应用中,将前20KB区域划为IAP程序区,其余划为APP程序区。
STM32主存储区起始地址为0x0800 0000,IAP程序从此地址开始写入。
在STM32中,程序的第1个字是栈顶地址,第2个字是复位向量指针,然后依次是其他中断向量指针(即中断向量表从第2个字开始)。
在设备生成阶段,将IAP和APP程序按照表1区域划分烧写到对应区域,系统启动及工作流程如图所示:
系统复位后从0x08000004地址取出复位中断指针,跳转到IAP复位中断程序执行,执行完后跳转到IAP程序main函数继续执行,如标号①所示。
在IAP的main函数中判断是否更新程序,并执行相应操作,最后从IAP向APP的跳转,取出APP复位中断向量指针,跳转到APP复位中断函数执行,如标号②所示,执行完APP复位中断函数后,返回到APP的main函数继续执行,这就完成了IAP向APP的跳转。
需要注意的是,在APP的main函数执行过程中,如果发生中断,PC指针仍跳转到0x08000004地址中断向量表,然后根据APP中设置的中断向量表偏移量跳转到APP对应中断服务程序执行,执行完后再返回APP程序的main函数。
关键:
在设备生产阶段,将IAP和APP程序按照表1区域划分烧写到对应区域。系统复位后从0x08000004地址取出复位中断指针,跳转到IAP复位中断程序执行,执行完后跳转到IAP程序main函数继续执行。在IAP的main函数中判断是否更新程序,并执行相应操作,最后完成IAP向APP的跳转,取出APP复位中断向量指针,跳转到APP复位中断函数执行。
4G无线通信技术
本设计中4G模块选用上海移远通信公司的EC20 R2.1,该模块支持最大下载速度150Mbps和最大上行速率50Mbps,内置丰富的网络协议,支持TCP/IP协议。
在本设计中,EC20 R2.1在APP程序中初始化,使用TCP/IP组网,组网过程如图2所示。
当模块复位后,首先进行基础配置,如UART波特率,是否回显等,模块自动检测SIM卡,自动附着4G网络,网络附着成功后,设置APN名称、目标IP、目标端口号等参数,然后激活PDP场景,打开网络连接,此时单片机就通过4G无线网络接入了Internet。
基站可接入设备数量是有限的,为了保证可随时接入新的设备,基站会主动断开长时间无数据交互的设备。
本设计中为实现4G网络长连接,设置有心跳功能,定时向上位机发送心跳数据,上位机收到后回应心跳应答。
另外,当网络异常断开后,为了保证网络可恢复,必须在APP程序中设置有自动重新组网机制。
系统总体设计
本系统包括上位机、4G无线模块、STM32F103RCT6设备终端3个部分。单片机外接EEPROM,临时存储上位机发来的升级数据,单片机通过UART和4G模块相连,4G模块通过无线网络连接到上位机。
使用开发软件(如Keil MDK)完成程序编写、调试、编译,并转换为*.bin格式文件用于IAP升级。
进行升级时,上位机将待升级文件按规则分多包发送到STM32设备,并做好缺包查询、重发、校验等,确保升级数据正确。
在APP程序中接收升级数据。设备收到升级数据包后,临时存储在EEPROM中,待所有升级包发送完且验证正确后,“升级标记”置位,然后软件复位重启系统,重新进入IAP程序,在IAP中将升级数据从EEPROM转存到单片机内Flash的APP程序区,完成升级。
IAP程序设计与分析
上电后程序从Flash存储区(起始位置为0x08000000)启动,执行IAP程序,依次进行外设初始化、“升级标志”检查、升级数据验证等,将升级数据转存到APP程序区,并清除“升级标志”,跳转到APP程序区执行。若“升级标志”无效,则直接跳转执行原来的APP程序。
在IAP程序中将升级数据转存到APP程序区如下:(首先擦除Flash空间,然后从临时存储区中读出数据,写入APP程序区)
NbrOfPage = FLASH_PagesMask(size); //计算升级文件占用多少Flash页
//擦除需要重新编写程序的Flash页
for(EraseCnt=0; EraseCnt<NbrOfPage; EraseCnt++){
FLASHStatus = FLASH_ErasePage(FalshDest + (PageSize * EraseCnt));
for(j=0; j<=size/512; j++){
//将升级代码写入Flash,每次512字节
if(j == size/512){
packet_len = size % 512;
}else{
packet_len = 512;
}
SDReadDate(path,Buff,packet_len,512*j); //从备份区读出升级代码
Source = (uint32_t)Buff;
for(i=0;(i<packet_len)&&(FlashDest<RunAppAddr+size); i+=4)
FLASH_ProgramWorld(FlashDest, *(uint32_t *)Source);
FlshDest += 4;
Source += 4;
}
}
将升级数据全部写到APP区后,清除“升级标志”并跳转到APP区继续执行。跳转代码如下:
//RunAppAddr为APP程序起始地址,本设计中为0x08005000
//检查栈顶地址是否合法
JumpAddr =*(__IO uint32_t *)(RunAppAddr+4); //获取APP的复位函数地址
Jump_To_App(pFunction)JumpAddr; //将跳转地址强制转换为指针函数
__set_MSP(RunAppAddr); //设置主堆栈指针
Jump_To_App(); //跳转执行APP程序
执行跳转程序时,首先检查栈顶地址是否合法,RunAppAddr是APP的起始地址,为0x08005000,程序的第1个字(4个字节)为栈顶地址,判断栈顶地址是否在RAM区域(0x20000000~0x2001FFFF),如果栈顶地址合法,取出APP复位中断指针(第2个字),并设置栈顶指针,最后跳转到APP复位中断服务函数,开始执行升级后的APP程序。
APP程序设计与分析
在APP程序中,首先要设置中断向量偏移表。在APP运行过程中如果发生中断,跳转到0x0800 0004复位中断向量后,根据设置的中断向量偏移量跳转到APP对应的中断服务程序。如果在偏移量设置前发生中断,将不能正确返回原地址运行导致系统异常,所以在APP程序中要尽早设置中断向量表偏移量。
本设计中IAP升级过程主要由“升级开始、缺包查询、发包数据、升级结束”4组指令完成,结合图5,具体操作流程如下:
- 升级开始,上位机发送“升级开始”指令,设备收到后做好升级准备工作,记录代码总大小,每包大小、总包数等信息,进行相应参数的初始化,并向上位机返回应答。
- 准备工作做好后,上位机发送“缺包查询”指令,设备向上位机返回缺包序号。
- 上位机收到缺包信息后,依据缺包号逐包发送升级程序。发送升级包时采取无应答发送,每隔一段时间(如400ms)发送一包数据,不必关心设备有没有正确接收。设备收到升级包后,按照包序号、大小顺序存储在临时存储区中。
- 上位机按照确保信息发送完所有包后,再次发送缺包查询指令,在步骤3发送升级包失败的,在此步骤上位机可以重新获取缺包序号。
- 按照新的缺包信息,逐包发送升级包。
- 重复步骤4、5,直至所有升级包发送完成。
- 成功发送完所有升级包后,上位机发“升级结束”指令,其中包含整个升级文件的CRC校验码,设备收到结束指令后,对接收到的全部升级数据进行CRC校验,如果校验码和上位机发送的一致,则认为升级数据正确,置位“升级标志”,并软重启设备,进入IAP程序,将临时存储区的升级数据复制到APP程序区,跳转到新程序执行,至此升级完成。
系统验证与分析
将EEPROM更换为256KB容量,保证临时存储空间足够。
使用Keil MDK完成IAP和APP程序后,使用JTAG分别烧写到IAP区和APP区。
系统启动后从IAP跳转到APP开始工作,待4G组网登录上位机后,开始远程升级测试。
本设计可靠性主要体现在:
- 设备4G网络断线后,可自动重新登录,避免因网络问题找不到设备,重新登录后,可从断点继续执行,不必重新发送所有数据。
- 通信协议设置有严格的校验机制,保证接收到每一帧数据正确。
- 缺包查询机制严谨,保证设备正确接收到每一个升级包。
- 在升级结束指令中发送整个升级文件的CRC校验码,设备将收到的升级数据以相同方式校验,与上位机发来的CRC对比,确保升级数据正确。