APP下载

嵌入式终端IAP断点续传的研究与实现

2014-09-25朱孟江聂云杰

单片机与嵌入式系统应用 2014年1期
关键词:指针字节中断

朱孟江,聂云杰

(南京南瑞集团公司,南京211100)

引 言

在线应用编程(In-Application Programming,IAP)技术是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后方便地通过服务通信端口对产品中的固件程序进行更新升级。

目前电力市场的电能数据采集终端、集中抄表终端等设备之间通信都是通过GPRS,在一些偏远或者信号覆盖较少地区GPRS存在一定的不稳定性,会出现数据传输中断等现象。传统IAP方式没有考虑传输中断和传输误码等问题,采取传统方式对设备进行升级,如果升级过程中出现中断,不仅导致APP程序区遭到破坏,还会因为升级中断而再次重复升级,产生大量GPRS流量,因此急需一种行之有效的方法来解决这类问题。

本文将以ST公司的STM32F103RBT6为平台,阐述IAP断点续传的方案及其优化。该方案解决了升级过程中意外中断、远程升级数据传输误码等关键性技术问题,保证了待升级终端内部应用程序的正确运行。该方案方便快捷,避免了传统应用程序升级所带来的复杂繁琐过程,节约了大量人力资源,已在电力集抄系统中得到广泛的应用。

1 IAP原理

1.1 STM32F103RBT6芯片简介[1]

STM32F103RBT6是一款以Cortex-M3为内核的32位CPU,带有20KB的静态RAM以及128KB的Flash存储器,最高主频可达72MHz,外部拥有丰富的外设资源和通信端口,为在线升级端口提供更多选择。

1.2 传统IAP编程原理

对MCU而言,其程序都是一系列二进制代码,并存储在Flash空间。当MCU上电之后,内核把存储在Flash内部的数据映射到RAM空间执行。因此在线编程可以看作是MCU对Flash空间的数据进行读/写操作。

传统IAP原理是在用户程序(APP)运行过程中,当接收到升级的命令后,把用户数据保存到EEPROM或上传到主站,然后跳转到升级区,对APP程序区进行升级,当程序升级完毕,再跳转到APP区执行APP程序。正常情况下,这种升级方法没有问题;但是当升级过程中出现中断,则整个APP数据区被破坏,即使下次升级成功,中间也会出现一段空白期。在电力仪表中,这种空白期将产生很大的影响,不仅丢失大量电能表数据,还会对用户产生一系列的影响。

传统升级流程图如图1所示。

1.3 IAP断点续传原理

断点续传能够很好地解决传统升级方式的不足,该方法主要原理是把Flash分成不同区域,每个区域存储不同的数据或者用户程序。以STM32F103RBT6为例,把内部Flash分成4个区域,如表1[2]所列。

图1 传统IAP流程图

表1 STM32RBT6内部Flash区域划分

第1个区域为IAP断点续传程序区,当终端上电或接收到升级命令时,程序指针跳转到0x08000000处开始执行,等待接收升级数据包;第2个区域存储一些升级相关的信息,每个信息表示上一次升级的状态,以结构体形式存放。如:

第3和第4个区域分别存储的是低区用户程序和高区用户程序。这样做的目的是当升级其中一个用户程序时候,即使升级被中断,也可以到另外一个用户区去执行相应用户程序,保证用户数据能够得到及时有效处理,该方法在电力集抄系统中显得尤为重要。假如某次系统升级被破坏,还可以运行原有的程序,继续电能量的采集。但是采用传统方式升级系统,假如升级过程被中断,就会导致整个终端系统崩溃,不仅造成国家大量电能量的流失,而且会影响用户的日常生活。

断点续传原理流程图如图2所示。

2 程序设计

2.1 中断向量表设置

中断向量表关系到终端的稳定运行,正常情况下终端设备复位后,设备程序指针自动指向0x00000004处,但是我们修改了用户程序的起始地址,因此要相应地把中断向量表的起始地址进行偏移。以低区用户程序为例,

2.2 通信协议

这里用串口对终端设备进行升级,协议帧结构如下:

图2 断点续传流程图

报文头设备ID帧类型控制码报文长度报文内容校验位报文结尾2字节2字节1字节1字节2字节数据1字节1字节

报文头:0x5A 0xA5。

设备ID:设备号。

帧类型:预留用来判断帧的作用,暂定0x01。

控制码:用来表明报文的作用,暂定下行是0x9X,上行是0x1X。

报文长度:是“报文内容”的长度。

校验位:校验位之前所有字符CRC(即从报文头至校验位之前的所有位的CRC)。

报文结尾:0xA5。

在通信协议里面加入CRC校验,能够很好地解决传输误码的问题;当接收方对接收到的数据进行校验时,如果校验值不正确,则丢弃本包数据,同时告诉主站重新发送该包数据。

2.3 Flash读写操作

Flash读数据直接从相应地址读取相应数据内容,即地址所指向的内容就是要读取的数据。Flash写操作需要注意在写之前应该先把写保护去除,否则导致写入失败。写入操作如下:

2.4 程序跳转设计

PC指针成功跳转是升级的关键。在跳转之前先关闭全局中断,保证PC指针指向非中断服务程序。跳转之后,首先把地址传入PC指针,然后初始化堆栈指针[3]。实现方式如下:

结 语

本文提出了一种基于STM32平台的嵌入式终端断点续传升级的新方法,该方法省去了传统应用程序升级所带来的复杂繁琐步骤,同时又规避了升级失败所带来的风险。随着国家对智能电网改造的推进,该方法也在电力集抄终端等设备得到大面积应用,便捷,可靠,具有极高的实用价值。

[1] ST.STM32F103XXX User Guide,2009.

[2] ST.STM32F10XXX闪存编程手册,2009.

[3] ST.STM32F10x_IAP_AN,2007.

猜你喜欢

指针字节中断
No.8 字节跳动将推出独立出口电商APP
垂悬指针检测与防御方法*
No.10 “字节跳动手机”要来了?
基于FPGA的中断控制器设计*
为什么表的指针都按照顺时针方向转动
简谈MC7字节码
跟踪导练(二)(5)
千里移防,卫勤保障不中断
浅析C语言指针
FPGA内嵌PowerPC的中断响应分析