STM32F205VB在远程系统升级中的应用
2014-06-01丁鹏飞
丁鹏飞 法 林
(西安邮电大学电子工程学院,陕西 西安 710121)
0 引言
随着嵌入式终端技术的发展,嵌入式系统在化工、机电、国防等领域的应用越来越广泛,嵌入式系统在现代工业中无处不在[1]。在石油化工行业中,用于设备运行状态检测和数据采集的智能仪器仪表的内部软件需要定期或不定期地进行升级[2],用于满足电网中配电变压器的自动化装置对系统的远程升级与维护提出的要求[3]。远程升级技术通过远程升级仪器的应用程序,满足应用过程提出的新的应用要求,降低系统升级的成本。
本文利用通用无线分组业务(general packet radio service,GPRS),设计了基于 STM32F205VB处理器的远程升级系统。系统使用GPRS模块实现升级代码的传输,具有价格低廉、网络覆盖范围广、无线传输等特点[4]。系统通过升级程序将接收的升级代码写入程序存储区,实现系统的远程升级,避免了工作人员到现场进行设备的升级,节约了时间和人力。
1 远程系统升级原理
在微处理器中,程序存储器的编程方法通常有3种[5]:并行编程模式、通过串口或JTAG等接口进行编程的在系统编程(in system programming,ISP)模式,以及在应用程序控制下的在应用编程(in application programming,IAP)模式。
并行编程是较早单片机的编程方式。该模式通过专用的编程器对单片机进行程序的烧写,需要额外的编程器,且花费较多的开发时间,这种单片机已被淘汰。ISP编程模式由于其调试的方便性得到众多厂家的广泛支持。IAP是应用Flash程序存储器的一种编程模式[6]。IAP模式是将Flash程序存储区化分为两个不同程序区域(程序区域1和程序区域2)。运行于程序区域1的应用程序为引导加载程序,即Bootloader程序;运行于程序区域2的应用程序为用户应用程序。Bootloader程序是一段引导程序,它驻留在处理器的程序存储器,当处理器上电或复位后在用户应用程序之前运行。Bootloader程序检测升级标志位确定是否需要对用户应用程序进行升级。如果不需要升级应用程序时,直接运行用户应用程序;如果需要升用户级应用程序时,Bootloader程序通过Flash存储器的擦除、读、写机制对程序区域2进行擦除,并将需要更新的程序写入程序区域2,即写入应用程序区域。当程序区域2的应用程序更新完毕后,跳转到程序区域2运行新用户程序,从而实现程序的升级。
2 远程升级功能的实现
本文针对意法半导体(ST)公司所开发的基于ARM Cortex-M3内核的STM32F205VB处理器,研究远程升级功能的实现方法。该方法将STM32F205VB处理器的 Flash存储器分为3个区:升级引导程序(Bootloader)区、用户应用程序区以及升级代码+升级标志区。每次上电后,Bootloader根据升级标志判断是否需要升级用户程序。当需要升级应用程序时,Bootloader将接收的升级代码写入用户程序区,并删除升级标志并运行用户应用程序;当不需要升级应用程序时,直接运行用户应用程序。STM32F205VB处理器通过GPRS模块与远程控制中心实现无线连接,并通过GPRS模块接收控制中心的控制命令和升级代码。远程升级的连接框图如图1所示。
图1 远程升级连接框图Fig.1 Block diagram of the remote upgrading system
2.1 STM32F205VB 处理器
STM32F205VB处理器是意法半导体公司生产的基于ARM 32位Cortex-M3内核的处理器,其自适应实时加速器使Flash存储器的程序无等待执行,时钟频率高达120 MHz。该处理器集成了3路12位A/D转换器、2路12位D/A转换器、通用DMA控制器、高达17个定时器,支持串行线调试(serial wire debug,SWD)和联合测试测试行动小组(joint test action group,JTAG)接口协议。该处理器具有128 kB程序存储器和64 kB SRAM,支持I2C、SPI、CAN等通信方式。
2.2 Flash程序存储器的划分
STM32F205VB处理器有1片统存储器区,地址为:0x1FFF0000~0x1FFF7A0F。该存储器区域为处理器的引导空间,即通过串口下载用户程序的内置引导程序。处理器的引导模式选择管脚(BOOT1、BOOT0)决定处理器的启动模式。当BOOT1=X、BOOT0=0时,运行用户程序;当 BOOT1=0、BOOT0=1时,运行内置引导程序实现应用程序的下载;当BOOT1=1、BOOT0=1时,运行内置SRAM中的程序。运行用户应用程序时,BOOT0=0;运行内置引导程序下载用户应用程序时,BOOT0=1。因此,通过内置引导程序升级用户程序时必须改变BOOT0管脚的电平,而当程序下载完成时需再次改变BOOT0管脚的电平。应用内置引导程序进行程序的下载需要对BOOT0关键进行短接,而“短接”动作与“远程”直接矛盾[7]。因此,基于STM32F205VB处理器应用系统的远程升级必须通过自己的引导程序实现应用程序的更新。
为实现应用系统的远程升级,将STM32F205VB处理的程序分为用于实现用户应用程序升级的Bootloader程序和用户应用程序。在升级应用程序前,需要接收用于系统升级的程序代码。因此,实现远程升级功能涉及Bootloader程序、用户应用程序的设计和升级代码的存储。充分考虑STM32F205VB存储器内置了128 kB的Flash存储器,将Flash存储器划分为Bootloader程序存储区、用户程序存储区和升级代码存储区。STM32F205VB将Flash存储器将存储区划分为5个扇区,存储地址从0x80000000开始,第0~3扇区分别为16 kB,第4扇区为64 kB,共128 kB(如果需要更多的存储空间,可以选择Flash存储空间更大的处理器,如STM32F205ZG的Flash存储空间为1 MB)。扇区的擦除是以扇区为单位进行的。为此,根据Bootloader和用户程序的大小,将Flash存储器空间进行分配,分配值如表1所示。
表1 STM32F205VB Flash存储器分配Tab.1 STM32F205VB Flash memory allocation
2.3 系统升级程序设计
系统升级程序设计成用于接收升级代码的升级代码接收程序和更新应用程序的Bootloader两个部分。系统升级程序的流程图如图2所示。系统上电后,首先运行Bootloader程序,Bootloader程序通过读取升级标志位确认是否对系统程序进行升级。当升级标志位置位时,Bootloader读取升级代码并将升级代码写入用户程序区,升级代码写入完毕后,启动应用程序。当应用程序接收到升级代码时,应用程序接收升级代码并存储到升级代码区,升级代码接收完毕后判断接收代码是否完整、正确。当判断升级代码接收完毕且完整无误时,置位升级标志位并复位处理器。处理器复位后运行Bootloader将接收的升级代码写入用户程序区实现系统程序的升级。
图2 系统升级程序流程图Fig.2 Flowchart of the system upgrading program
Bootloader设计是远程升级的重点,如何避免升级过程中出现的各种意外情况,是远程升级的基础。很多远程升级系统通过Bootloader接收升级程序数据[6-9],而在升级程序数据传输过程中有以下两种常见的原因导致传输时间较长:①由于传输传输链路不稳定可能导致同一包数据需要多次发送;②升级程序数据量大,而传输速率较低。这种远程升级系统方案在升级过程中应用程序停止运行,用户应用程序因较长时间不能处理设备的任务而不能满足实时性要求较高的场合。本文通过改变以往远程升级的数据传输方式,通过用户升级代码接收程序接收升级代码。升级代码数据准确接收后,设置程序升级标志,并重启处理器由Bootloader完成应用程序的升级,从而减少升级任务的处理时间,满足系统实时性的要求。Bootloader程序流程图如图3所示。
图3 Bootloader程序流程图Fig.3 Flowchart of the Bootloader
升级代码接收程序完成升级代码的接收。该程序通过接收数据中断启动,不影响应用程序的正常运行,保证了升级代码接收阶段系统的正常运行。升级代码接收程序的流程图如图4所示。
图4 升级代码接收程序流程图Fig.4 Flowchart of the upgrading code receiving program
3 系统升级的可靠性设计
系统应用程序的升级必须保证升级数据的正确性和升级代码的完整性。不完整的升级代码或不正确的升级代码都将使系统瘫痪。通过远程升级的抗掉电、抗误码和合法性等措施,保证了系统升级的可靠性和安全性。
3.1 远程升级抗掉电设计
在进行升级的过程中,难免会出现突然掉电的情况,所以必须有可靠的机制避免因突然掉电而导致程序升级失败的情况。在程序升级的过程中,突然掉电可能发生在以下两种情况:①数据接收过程中;②数据已接收完毕,Bootloader正将升级程序复制到应用程序区。在第一种情况下,应用程序不会置位升级标志位,原来的应用程序区域保持不变,重新上电后,处理器运行老的应用程序,不会出现因升级的应用程序不完整而使系统瘫痪的情况。在第二种情况下,重新上电后,Bootloader读取升级标志位并重新复制应用程序,完成应用程序的升级,从而保证写入程序存储区的程序是完整的。
升级代码接收程序将升级代码存储到Flash存储器,充分保证在第二种情况发生时能进行应用程序的正常升级。在接收升级代码期间,系统应用程序正常工作,大大减少了因系统升级而不能工作的时间。
3.2 远程升级抗误码设计
升级代码接收程序接收的升级代码数据是处理器运行的代码,很小的传输错误都会造成升级后的系统瘫痪。因此,消除升级错误传输码的升级程序是保证系统升级后正常运行的关键,为此,采用带CRC校验的通信协议解决。
为保证接收数据的正确性,设计升级代码的传输帧格式表2所示。
表2 升级代码的传输帧格式Tab.2 The transmission frame format of upgrading code B
表2中,起始标志表示帧头;功能码表示该帧是升级命令帧,收到该帧数据表示接收的数据为远程升级代码;总帧数表示升级代码的总帧数;当前帧表示当前为升级代码的第几帧;数据表示升级代码数据;校验位表示数据帧中前1028个数据的CRC校验码。当传输最后一帧数据时,有可能升级代码不足1024 B,不足的字节在数据帧中用0xff填充,从而保证所有帧中数据的个数为1024 B。发送升级代码端在发送完一帧数据后等待下位机的应答数据帧,若收到正确的回应帧,则继续发送下一帧数据;若收到请求重发回应帧,则重发刚才发送的数据帧;3次等待超时则停止发送。
3.3 升级程序合法性检查
在远程升级的控制中心,可能因为操作人员的误操作将非升级代码的BIN文件当作升级程序文件进行了升级操纵。在误发送升级代码的情况下,接收端在升级了错误的升级代码后导致系统瘫痪,必须由技术人员到现场进行修复。因此,升级程序合法性检查是保证系统升级后正常运行的重要手段。为此,采取以下方式保证升级程序的合法。
①对发送升级代码端的应用程序设置登录密码,并设置登录人员的使用权限。只有授权进行远程升级的用户,才能进行远程升级操作。
②在应用程序设计过程中,定义用于程序合法性的字符串常量,并将该常量定位到某个固定的地址,当控制中心打开升级代码的BIN文件时,检查固定地址的合法性字符串常量。当检测到字符串为非法时,拒绝执行远程升级操作;当字符串合法时,才允许操作人员执行远程升级操作。
通过升级程序合法性检查措施,杜绝了因操作人员的非法操纵或误操作导致的系统瘫痪,大大提高了远程升级的安全性和可靠性。
4 结束语
本文所设计的基于STM32F205VB的远程升级技术,通过Flash存储器的合理划分、抗掉电设计、抗误码设计和程序合法性检查等手段,保证了该升级技术的高度稳定性和可靠性。该设计方案巧妙地将升级代码接收程序作为系统应用程序的一部分并通过中断方式启动,在升级代码接收结束后运行Bootloade实现系统的升级,解决了升级过程中系统长时间不能工作的难题,满足了系统实时性的要求。该远程升级技术可以应用于其他控制系统,具有广泛的应用前景和较高的使用价值。
[1]Shi Wenchang.Implementing operating system support for extended trusted path in TPM-capable environments[J].Journal of Natural Sciences,2006,11(6):1493 -1497.
[2]张宏建,蒙建波.自动检测技术与装置[M].北京:化学工业出版社,2004.
[3]韦文详,刘晓莉,张桂玉.一种嵌入式远程配变监控终端的研究与设计[J].自动化仪表,2007,28(3):13 -16.
[4]陈新,刘慧威,赵彦平,等.单片机程序远程升级的研究与实现[J].电子质量,2011(12):53 -56,78.
[5]田日才,王国鹏,梁学东.ATMEGA128单片机的软件远程升级[J].电子技术应用,2003(11):23-25.
[6]李卫红,张凌云,陈天喜,等.基于IAP程序远程更新设计在车载乘客信息显示中的应用[J].机车电传动,2012(2):79-81.
[7]尹恒,严华.一种针对嵌入式远程升级安全的存储解决方案[J].计算机应用,2011,31(4):942 -944,998.
[8]孙钢,朱忠常,景振兴.煤矿安全监控分站远程升级方案[J].工矿自动化,2012(3):58 -60.
[9]杨晶,何鹏举,朱升林,等.具有远程升级功能的网络化智能温控器[J].测控技术,2012,31(11):6-10.