基于STM32单片机的监控终端程序代码远程升级功能的实现

2016-03-09 03:40李芙玲
华北科技学院学报 2016年3期
关键词:主程序应用程序远程

李 永,李芙玲

(1.华北科技学院 机电工程学院,北京 东燕郊 101601;2.华北科技学院 计算机工程学院,北京 东燕郊 101601)

基于STM32单片机的监控终端程序代码远程升级功能的实现

李 永,李芙玲

(1.华北科技学院 机电工程学院,北京 东燕郊 101601;2.华北科技学院 计算机工程学院,北京 东燕郊 101601)

本文介绍了监控终端程序代码实现远程升级的实现方法,该监控终端以STM32F103系列单片机为核心,采用现场总线CAN总线作为通信网络;整个系统八包括监控终端和服务器;在监控终端设计中,将监控终端程序分成了启动控制程序BOOT_APP和主应用程序MAIN_APP;服务器通过网络从远程向监控终端发送更新程序,从而实现监控终端程序的在线更新,这种监控终端程序的远程升级方法的应用,降低了监控终端的运行成本,提高了监控终端的适用范围。

STM32F103单片机;远程升级;HEX文件;MDK-ARM ;Visual Basic

0 引言

在煤矿生产过程中,人们用了大量监控设备来时时监控煤矿生产过程的各项参数、状态等信息,这些监控设备的应用提高了煤矿的安全生产水平,他们又被称为监控终端。由于煤矿的生产环境随着时间在不断改变,所以,煤矿安全生产对监控设备的要求也是再不断变化的,而监控设备的更换费时费力,而且会影响生产;另一方面,从生产现场的需求来看,生产环境的变化对监控设备需求的改变主要是要求其软件功能进行相应升级就够了,所以,监控设备软件系统如果具有远程升级的功能,则对煤矿生产来说,将能节约大量的财力物力,且能够减少煤矿停工检修时间,提高煤矿生产效率。

目前,大多数监控终端软件升级基本上有两种方法:第一种,应用在使用8031系列单片机的监控终端,升级方法是直接更换其程序存储器(ROM);第二种,应用在使用STC或AVR类型单片机的监控终端,升级方法是通过ISP接口或JTAG接口重新下载程序。这两种方法都需要将监控终端停止工作,升级操作完成后再投入,因此对生产的影响较大。而本文设计的方法可以通过网络在线升级,能够最大限度地减少对一线生产的影响。

2 监控系统整体设计

若实现监控系统软件升级的功能,必须设计服务器,用户通过服务器对监控终端发出控制命令、接收监控终端发来数据,并对数据进行处理、显示、打印、存储等功能,同时,用户还可以通过服务器对监控终端软件系统实现升级维护。监控系统整体设计框图如下:

图1 具有升级软件在线升级功能的监控系统整体设计框图

上图中,左边部分时监控终端的框图,该监控中断以STM23F103系列单片机为核心。外围电路主要包括模拟量输入模块、开关量输入输出模块、CAN接口通信模块和Flash存储器模块等。模拟量输入模块主要完成现场模拟量参数输入功能,STM32F103系列单片机内部有12位A/D转换器,因此不用外接模数转换芯片,模拟量输入模块仅需要完成信号的变换和接口的保护等功能;开关量输入输出模块用于实现现场开关量及配置信息输入和控制信号输出的功能,该模块要做好隔离及开关量输出的安全可靠设计;CAN接口通信模块的功能主要时实现监控终端与其他智能设备或服务器间的通信,因为井下巷道狭窄、设备密集,电磁干扰较为严重,因此为了保证通信质量我们采用了CAN总线通信的形式,CAN接口处也要做好隔离措施,保证接口安全和抗干扰性能;Flash存储器模块是我们的设备为实现软件系统远程升级专门设计的芯片,我们采用的时Winbond公司的SPI Flash芯片,容量为1M,监控终端中选用的单片机是STM32F103RB,该单片机的程序存储器容量时128k,1M字节的SPI Flash芯片存储升级程序已经够用,同时剩余的空间可以存放配置参数或监测数据;系统的服务器采用一般PC机就可以,也可以采用专用的服务器主机,该服务器通过外接R232接口到CAN总线接口的转换模块实现与CAN总线连接。

3 监控终端软件设计

STM32系列单片机的程序存储器内容的修改不需要提供额外的更高电压,在其3.3 V工作电压就能够很方便地擦除和改写,而且该单片机有专用的擦除和改写程序存储器的指令,因此,该型号系列单片机能够很方便地实现软件系统的在线更新。

STM32系列单片机实现程序更新的实现方法是:将监控终端的程序分解为两部分,一部分为启动程序,称为BOOT_APP;另一部分为主应用程序,称为MAIN_APP;启动程序BOOT_APP放在程序存储器的前边一段,占10k的存储空间,从程序存储器11k的开始位置放置主应用程序,MAIN_APP是可以更新的,而BOOT_APP功能时检查是否有更新程序,并实现将更新应用程序安装到主应用程序区段,实现主应用程序更新的功能,而BOOT_APP部分是不能更新的。BOOT_APP部分程序的框图如下:

图2 BOOT_APP程序框图

在BOOT_APP程序的设置中,该程序在单片机中存储起始位置设置为0x08000000;而主程序的起始放置地址是0x08002800。更新程序放在外部的SPI Flash中,是否进行更新要进行两个判断,一个是判断是否有更新程序;另一个还要判断更新程序是否完整。

单片机复位后从0x08000000开始执行,也就是执行BOOT_APP程序,从BOOT_APP程序跳转到主程序的语句如下:

JumpAddress=*(__IO uint32_t*)(APP_ADD+4); //跳转至用户主程序

Jump_To_Application=(pFunction)JumpAddress;

__set_MSP(*(__IO uint32_t*)APP_ADD); //初始化主程序的堆栈指针

Jump_To_Application();

前面代码中,APP_ADD是主程序起始地址0x08002800;JumpAddress是一个32位地址指针;Jump_To_Application是一个程序指针变量。

主应用程序(MAIN_APP)在运行过程中可以通过网络接收服务器发来的更新程序,并将更新程序存储到外部SPI Flash中,当更新程序下载完成,经过校验无误后修改更新标志,并根据服务器命令要求重新启动监控终端;监控终端重新启动后,BOOT_APP首先运行,在其运行过程中查更新标志,发现有了更新标志,则启动更新过程,将SPI Flash中的程序写入到STM32的主应用程序区段,实现更新主应用程序的安装,然后BOOT_APP删除更新标志,并引导单片机跳转到主应用程序执行。MAIN_APP部分程序的程序根据用户的设计完成需要的功能,每个项目写的程序可能千差万别,这里不再介绍其程序框图;但是如果想实现远程代码升级,在MAIN_APP中要设计接收远程发来代码的子程序,当程序代码接收完成后设置更新标志,这里还要考虑断电续传等功能,限于篇幅本文中不再详细叙述;但是在主程序的编译中,其工程设计选项和下载选项需要设置,我们的设计中主程序从0x08002800开始执行,所以在编译环境(我使用的是MDK-ARM 4.7)中要设置编译目标文件的起始地址为0x08002800,在JLINK下载的Flash Download设置中也要设置为从该地址开始下载。同时在MAIN_APP的中断向量设置中需要设置中断向量从0x08002800开始,否则主程序的中断执行将出现错误,中断向量设置语句如下:

SCB→VTOR = NVIC_VectTab_FLASH|0x2800;//将中断向量设置为从0x08002800开始

需要把上边这条语句加到主程序的初始化程序中。

1) 服务器端升级软件设计

服务器端程序是用Visual Basic6.0程序编写,服务器端设计软件的功能是打开更新程序文件,通过网络将更新软件发送给远方的监控终端。单片机程序编译完成后下载到单片机的是二进制文件,可以是BIN为扩展名的文件,也可以是HEX为扩展名的文件,使用的是HEX为扩展名的文件。升级的过程就是将更完善的程序编译成HEX文件,然后通过网络将HEX文件内容发送给监控终端,监控终端的BOOT_APP程序根据收到的程序文件内容更新MAIN_APP。

下面是一个用KEIL编译的STM32单片机的程序的HEX文件。

:020000040800F2

:10280000881E00202D980008359800083798000889

:10281000399800083B9800083D9800080000000027

(中间行省略)

:10C4D0002A04681AFF010118025B022D01020304FD

:10C4E0000410090607080902040608ACA24A041C45

:04C4F0002918000007

:04000005080028EDDA

:00000001FF

该HEX文件实际时文本文件格式的,每行起始字符都是冒号,在冒号后边两个字符代表一个16进制的一个字节,第一个字节表示该行中有效数据的长度,后边两个字节为该行数据在单片机FLASH中存放的起始地址(如果改行是数据行的话),第4个字节表示改行数据的类型,在前面文件中第一行的04表示改行为扩展地址,后边的0800为扩展地址,数据在FLASH中存储地址的前4位为0800,每行最后一个字节时改行的校验和,该校验和的计算方法是改行前边所有字节和用256减后的结果。

HEX文件中第二行开始包含了程序真正的运行代码,第二行的第一个字节10表示该行有16个有效数据字节,地址2800表示该行代码放在单片机FLASH中的起始地址时0x08002800,后边的第4个字节00表示该行为数据行,在升级程序时只需要把后边的这16个字节传送给监控终端,并且告诉终端该16个字节从08002800开始存放。上边文件的倒数第3行“:04C4F0002918000007”是该HEX文件数据部分的最后一行;倒数第二行“:04000005080028EDDA”表示的含义时该HEX文件数据部分结束,主程序入口地址为0x080028ED,该地址与0x08002800之间的部分存放的是常数、子程序入口地址等内容,该行数据不需要传送给监控终端;HEX文件的最后一行“:00000001FF”表示的是该HEX文件的结束,该行也不需要传送给监控终端。

2) 服务器传送HEX文件给监控终端的过程

图3 服务器向监控终端发送升级代码框图

在服务器发送升级程序时,首先要查看终端的程序是否要升级,查看的方法是向终端发送查看版本的命令,如果终端返回的程序版本与要升级的程序版本相同则不需要升级;如果版本不同,则可以启动升级过程,升级中要查看升级是否完成,如果没有完成,则按断点续传的要求继续传送后边的代码;当所有代码都传送完毕后,进行教研检察,经检查发现传送正确,则认为升级完成,最后标记更新完成标志,结束升级过程。

4 应用举例

参与研发的配电在线监测系统是一个用在10kV架空线路上的在线监测系统,主要用于监测架空线路的短路、接地故障及实时监测线路电流变化情况。该系统包括:卡在线路上的带通信功能的架空线路故障指示器、固定在线杆上的数据采集传输中端(DCU)和后台监控服务器部分。

该系统中DCU用的单片机型号是STM32F103R8T6,有64 k的Flash程序存储器;外部扩展的用于存储临时升级Flash的芯片是Winbond公司的W25X16,该芯片容量为1 M,除了64 k(我分配的是1 k到65 k部分)用于升级外,其余部分用来存储配置信息及部分重要数据。升级过程如下:

(1) 首先要将升级程序(BOOT)写入单片机,该程序用于实现有无升级数据的判断及引导单片机运行主程序。

(2) 将应用程序主应用程序(APP)写入单片机使系统能够运行,该主程序功能是完成系统主要功能及接受远程升级数据,并将升级数据存储到外部Flash中。

(3) 需要升级时将新编译好的升级文件(主程序的HEX文件)拷贝到服务器上。

(4) 将升级数据文件转换为升级主控程序能够识别的文件格式,我设计的升级主控程序是用Visual Basic编写的,需要将升级数据文件转换为EXCEL95格式,转化方法也很简单,只要用EXCEL打开该文件,并另存为EXCEL95格式就行。

(5) 在服务器上运行升级主控程序,启动网络监听功能;设置DCU连接到升级主控程序,由主控程序启动升级功能完成在线升级数据下载到DCU的过程。

(6) 程序下载完成后,由升级主控程序发送控制指令,使DCU重新启动,DCU在重新启动时BOOT程序读取最新的数据文件,并将其覆盖单片机中原有主应用程序。之后,BOOT程序控制下完成升级后再引导单片机运行主程序,完成本次远程升级的过程。

升级主控程序运行界面如下:

图4 升级主控程序界面

5 结论

本文描述了监控终端实现程序代码远程升级的设计和实现方法,文中监控终端采用了高性能STM32F103系列单片机,通过该方法设计的监控终端可以实现软件系统的在线升级,使监控终端的使用、维护和功能完善更加方便,提高了监控终端的适应性,也降低了现场使用监控终端的运行和维护成本。

该在线升级方法适用于应用STM32系列单片机作为核心控制单片机的监控终端,并且若想实现远程升级则需要该终端具有远程联网功能。本方法已经在笔者参与研发的配电在线监测系统中投入使用,实践证明该升级方法操作简、安全可靠,能够满足监控系统终端程序在线升级的要求。在该系统中利用本文介绍的在线升级方法实现了DCU的在线远程升级。

[1] yx_l128125 STM32 IAP 在线升级详解[EB/OL].http://blog.csdn.net/.2013.10.

[2] 张河新,王晓辉,黄晓东.基于STM32和CAN总线的智能数据采集节点设计[J].化工自动化及仪表,2012(1):78-80.

[3] 高兵权,孙志海,汤丽,肖学福.基于STM32控制器的地层应力检测装置研究[J].华北科技学院学报,2011(3):31-34.

[4] 阙凡博.基于STM32的远程升级系统的设计[J].科技广场,2013(5):97-100.

[5] 张宏涛.基于802.11b/g的井下机车无线遥控系统设计[J].华北科技学院学报,2010(4):74-77.

[6] 丁鹏飞,法林.STM32F205 VB 在远程系统升级中的应用[J].自动化仪表,2014(5):80-83.

[7] tbdoer HEX文件编码格式解析[EB/OL].http://wenku.baidu.com 2015.11.

[8] 孙启富,孙运强,姚爱琴.基于STM32的通用智能仪表设计与应用[J].仪表技术与传感器,2010(10):34-36.

Realization of Remote Upgrade of Monitoring Terminal Program Code Based on STM32 MCU

LI Yong,LI Fu-ling

(1.Schoolofmechanical-electricalengineering,NorthChinaInstituteofScienceandTechnology,Yanjiao, 101601,China;2.Schoolofcomputerengineering,NorthChinaInstituteofScienceandTechnology,Yanjiao, 101601,China)

This paper presents the monitoring terminal program code realization method of remote upgrade, the terminal to STM32F103 Series MCU as the core by CAN bus as the communication network; the whole system including monitoring terminal and server; in the monitoring terminal design, monitor the terminal program divided into the start control program BOOT_APP and main application MAIN_APP; server send the updates to the monitoring terminal by network, so as to realize the monitoring terminal program online updates, application of this monitoring terminal program to the remote upgrading method, low operation cost of the monitoring terminal, improving the scope of application of the monitoring terminal.

STM32F103 MCU; remote upgrade; HEX file; MDK-ARM; Visual Basic

2016-03-19

中央高校基本科研业务费资助(3142015095)

李永(1972-),男,河北徐水人,硕士,华北科技学院机电工程学院副教授,研究方向:电力系统自动化。E_mail:liyong@ncist.edu.cn

TP277

A

1672-7169(2016)03-0072-05

猜你喜欢
主程序应用程序远程
让人胆寒的“远程杀手”:弹道导弹
远程工作狂综合征
自动升级程序在船舶监测系统中的应用
浅谈数控铣削技术代码程序的嵌套方式研究
删除Win10中自带的应用程序
电控冰箱软件模块化设计
谷歌禁止加密货币应用程序
远程诈骗
时光倒流 换回PotPlayer老图标
三星电子将开设应用程序下载商店