基于STM32的煤矿井下传感器软件安全升级系统

2019-11-05 10:20王博文周德胜
计算技术与自动化 2019年3期

王博文 周德胜

摘   要:煤矿井下的传感器种类繁多,特别是瓦斯、风量、顶板压力等传感器担负着安全告警等重要的角色,为了使传感器的软件易于安全维护,提出了一种基于STM32的井下传感器升级系统。主要利用单片机对目标代码分散加载的原理,以及其他诸如断点续传等诸多关键技术。在瓦斯相对浓度比较高的巷道、采煤的工作面、以及采煤钻机附近,使用该技术能够保障系统能够在不失安全的情况下解决井下传感器软件的更新换代问题。

关键词:传感器软件;STM32软件升级;井下安全系统

中图法分类号:TP393                                         文獻标识码:A

Absrtact: There are many kinds of sensors in coal mine,especially gas,air volume,roof pressure and other sensors,which play an important role in safety warning. In order to make the software of sensors easy to maintain,this paper puts forward an upgrade system of underground sensors based on STM32. The principle of scattered loading of target code by MCU and other key technologies such as breakpoint continuation are mainly used. Practice has proved that the system can solve the problem of updating and replacing the downhole sensor software without losing safety.

Key words: sensor software;STM32 software upgrade;underground safety system

软件升级是产品出厂后,产品开发的继续,也是改善产品质量,提升客户满意度的重要途径。软件升级主要有烧录和在线升级两种方式,烧录是指通过微控制器的JTAG口,通过JTAG协议将程序的目标代码下载到FLASH中去[1]。而在线升级是通过数据线如UART协议CAN协议,以太网、无线通讯等方式将目标代码通过微处理器内部的升级系统(通称BootLoader)将目标文件下载到处理器的FLASH中去的方法。

井下嵌入式设备自身的特点如:

①隐蔽性:井下嵌入式设备主板在钻机、分站内内深埋无法通过有效的JTAG口去烧录程序,且通过STM32提供的串口在线升级工具有诸多局限性,如不能通过网络升级程序,升级过程中必须中断程序的执行[2]。

②分散性:井下嵌入式设备在实际的应用比较分散如瓦斯浓度、风量、风压传感器分散于巷道内,大面积、长距离铺设。

③安全性: 煤矿井下的传感器如用的最普遍的瓦斯传感器,安全级别较高,要求在任何情况下能够检测到瓦斯浓度的变化并作出响应,如声光告警等信息。而实际的程序升级过程中,会造成应用程序执行的中断,必须待升级完成后,重启才能恢复执行。

井下的情况比较特殊,危险源比较多,针对传感器软件升级换代没有一个固定的标准。由于笔记本电脑等PC机没有防爆性能,所以近距离进行传感器软件升级不符合安全规程。通常的做法是将需要升级的传感器拿到井上再做升级,或者在井上的机房通过上位机下发指令进行软件的升级。将传感器拿到井上进行软件升级的办法耗费人力物力较大,非常不科学。通过上位机下发指令进行传感器软件的升级虽然有较多便利性,但是软件升级的过程会造成传感器监控程序的中断,势必会影到煤矿安全监控系统的可靠性。基于以上问题,本文在下文着重论述了传感器软件安全升级的可行办法。

1   井下传感器升级系统

1.1   系统概述

如下图1所示,井下传感器的网络构成主要有矿井局域网、分站和传感器网络组成。矿井局域网上面搭载的有web服务器、人员定位、PC客户端、视频监控、地面信息传输接口等系统。分站和矿井局域网之间通过一个信息传输接口(RS485转以太网)连接,分站和传感器之间采用RS485总线连接。为了实现地面上位机PC客户端远程对传感器的升级,由PC客户端将升级的指令通过信息传输接口发送至分站层,分站经过查询路由表,对PC客户端发送的指令进行屏蔽或者接收,然后采用485协议通过广播的方式将下载程序的指令下发至传感器总线上。传感器收到后比较对应的ID号,如果ID匹配则响应并进入升级处理流程,否则就不予处理。

1.2   传输协议

传感器主板上电后启动Bootloader程序,Bootloader程序在启动后的5S内接收上位机发出的升级程序指令,如果收到并校验成功则进入升级流程,否则5S后检查应用程序APP标志位判断是否有应用程序存在,如果有应用程序存在则程序指针跳入应用程序地址并执行,否则一直在循环接收上位机升级程序指令。

传感器主板在进入升级流程之前先要与上位机进行三次握手,告诉上位机自己的ID号,以及是否需要进行波特率跳变提速[3]。三次握手的数据包不包含序列号域,信息域只在需要时填充。

上位机将HEX文件进行拆分,拆分成若干个包并从1到N编排序列号Seq,然后逐个包进行发送,发送完成后启动超时定时器等待下位机响应。下位机收到包含目标HEX文件信息的数据包并进行校验通过后,发一条包含当前包序列号Seq的ACK响应信息给上位机,上位机收到并校验通过立即终止当前的超时定时器并将Seq累加1,启动下一包的发送[4]。

由于RS485串口数据传输存在断包的可能,所以为了兼容断包的接收,借鉴PPP协议引入了转义字符[5]。

若信息域中出现7EH,则转换为(7DH,5EH)两个字符。当信息域出现7DH时,则转换为(7DH,5DH)[6]。

发送方ID :当数据包为PC发出时为0xFF,当传感器发出时为传感器ID,范围[0x1,0xFE]。

接收方ID:当数据包接收方为PC时为0xFF,当接收方为传感器时为传感器ID,范围[0x1,0xFE]。

与PPP协议不同的是这里的CRC校验位包括了从发送方ID开始到信息域结束的所有信息,确保以上信息的准确性。

协议域,当信息字段为指令时为0xAA,当信息字段为HEX目标文件的信息时为0xDD。

这样做的好处是整个数据帧确保只有两个0xFE,这样假设出现断包时就可以将帧头和帧尾中间部分进行拼接,确保传输的效率。

1.4   三次握手

在煤矿井下的环境里,特别是数据长距离传输,干扰因素较多,所以通常采用的波特率是9600bps;而在近距离传输时,特别是产品出厂时,生产线可以采用较高的波特率如115200bps来提高烧录效率。在主板上电Bootloader启动后烧录程序之前,选择三次握手来确认是否通讯正常,三次握手中前两次是通过缺省的波特率9600bps通

信[7];如果有波特率跳变,第三次是通过跳变后的波特率进行的通信。协议字段填写握手次数。

第一次握手:上位机发出询问指令询问传感器是否在?发出四个字节的随机数Rand,传感器收到随机数之后对随机数进行加密,然后回应加密后(这里采用TEA加密)[8]的结果以及自己的ID號,这里ID号为0x05。采用随机数加密的方法是对传感器程序的一种安全保护,确认合法的身份才能进行升级。

上位机:0xFE 0xFF 0x00 0x01 Rand1 Rand2 Rand3 Rand4 CRCH CRCL 0xFE

传感器:0xFE 0x05 0xFF 0x01 TEA1 TEA2 TEA3 TEA4 CRCH CRCL 0xFE

第二次握手:上位机收到传感器发来的四个字节的加密结果后,先对加密结果进行校验,校验通过后则发送波特率跳变指令。这里信息域填充具体的波特率:如115200bps (填充0x11 0x52 )、19200bps(填充0x19 0x20)、38400bps(0x38 0x40)。

上位机:0xFE 0xFF 0x05 0x02 0x11 0x52 CRCH CRCL 0xFE

传感器:0xFE 0x05  0xFF  0x02  0x11 0x52 CRCH CRCL 0xFE

第三次握手:传感器发出第二条握手指令后,随即复位串口改变自己的波特率。上位机接收到第二次握手的响应后,也立即复位串口改变自己的波特率。然后双方用改变的波特率进行第三次通信【9】。信息域此时包括要烧录HEX文件的总大小。

上位机:0xFE 0xFF 0x05  0x03  SIZE1 SIZE2 SIZE3 SIZE4 CRCH CRCL 0xFE

传感器:0xFE 0x05  0xFF 0x03  SIZE1 SIZE2 SIZE3 SIZE4 CRCH CRCL 0xFE

三次握手之后,第四次通信即发送HEX文件的头200字节。任何一次握手失败,上位机重复发送三次指令,超时或响应校验错误,退出升级烧录流程。

1.5   分散加载原理

由于单片机FLASH的大小会影响单片机的成本,所以尽可能因地制宜扬长避短选择恰当的烧录模式。主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。

STM32片上有两个存储空间,一个是Nor Flash,一个是RAM,烧写程序所占用空间的大小,可以如下表示:

SIZEROM = SIZECode + SIZERO + SIZERW

程序的大小等于Code代码大小和常量数据大小、已初始化全局变量数据大小之和。STM32单片机程序既可以烧录在Nor Flash中执行也可以加载在RAM中执行。

分散加载就是主板启动后通过BootLoader引导程序根据配置信息,选择FLASH具体的应用程序目标代码所在的区域进行PC地址跳转,执行相应区域的应用程序过程。目标代码所在的区域可以是一个,也可以是多个。

HEX文件在FLASH中存储时,头部分是函数堆栈栈顶的地址,接下来是中断向量的地址。主板上电后,PC指针跳转到0x80000004的地址(如果有BootLoader,加一个偏移地址Shift)取出Reset_Handle向量的地址,并跳转相应的处理函数中执行,然后跳转到main函数执行。所以HEX文件中就要在编译的时候设置好堆栈栈顶地址,如下表所示IROM1是对HEX文件起始地址既堆栈栈顶地址以及大小的设置,IRAM1是对变量内存起始地址以及内存大小的设置。0x9000之前的地址为BootLoader目标HEX文件预留地址。

该函数完成BootLoader加载应用程序执行PC指针跳转前的准备工作,AppAddr代表要加载的分区的地址,为了系统安全期间函数首先检查地址是否合法,也就是目标区域是否烧录了程序HEX文件。然后通过MSR_MSP设置APP函数堆栈指针,也就是AppAddr。

而函数指针JumpToApp的值等于APP程序中断向量的入口地址,所以函数堆栈设置完成后通过一个空函数JumpToApp()完成PC指针的跳转[10]。

跳转到APP系统之后,首先会进入中断向量Reset_Handle,执行Reset_Handle函数,进而进入main函数执行。由于中断向量地址已经改变,所以应用程序系统初始化之前应调用ReNVIC_SetVectorTable函数重新配置中断向量地址为AppAddr+4,防止程序跑飞[11]。

1.6   双分区加载

多个区域存放程序的目标代码,可以让其中的一个区域用来正常运行程序,一个用来烧录目标HEX文件。这样就可以避免传感器正在升级程序而无法应对环境出现危险源的情况。应用程序除了正常的检测程序,在main函数的大循环里面增加一个烧录程序的program()功能,该功能与BootLoader的烧录功能协议完全一致。

考虑到FLASH成本,一般设置为两个分区。待目标HEX文件烧录完成后,将程序的版本号写入配置信息。重新启动系统,让BootLoader读取配置信息根据版本号对比,加载版本号大的分区,这样就可以完成传感器软件的升级。

擦除时间满足合理的范围,说明系统擦除工作没有其他损耗。如果擦除时间取最大值,那么1MB的Hex文件大约需要的时间(按照1MB/s的写入速度)为17 s左右,设置3 s 的安全阈值,总体时间设置为20 s。那么RC等于50。C取50 μf,R取1M欧姆,避免因R太小导致IC2输入电流较小。图5中电路C3、R2这样设计以后就可以保证电容的放电时间,满足1 MB以内Hex文件的烧录时间,保证STM32在失去正常工作模式之前完成程序的烧录。

以上两种方法都是基于井下传感器安全升级软件的考虑,满足实时检测环境的要求,保证不断线的情况下对软件进行的升级。

2   井下传感器安全升级系统的运用价值

RS485总线用115200 bps的波特率传输1 MB的文件数据,抛开发送和接收软件的处理时间,对传感器升级1 MB的程序文件大概所需的時间为:

传输时间和ACK响应时间却别就在于传输的数据包大小不同,ACK数据包较短,但考虑到软件处理数据的损耗时间,默认两者相等,经计算T大约等于3 min左右。

井下瓦斯浓度比较高的环境如采煤工作面、通风差的巷道、以及采煤钻机的周边,瓦斯的检测必须要求实时而且准确,否则会发生较大安全事故,严重可能危害人员的安全。例如采煤的钻机在掘进过程中会发生瓦斯突出,瓦斯突出会瞬间释放大量瓦斯和煤。瓦斯突出的时间和危害程度具有较大不确定性,并不能预研预判,所以相关的传感器例如顶板、甲烷传感器就必须保证持续有效的工作。只有传感器正常持续工作,检测到异常才能通过分站操作断路器局部断电或者启动排风系统,尽最大可能降低瓦斯的危害。没有使用该系统之前,对局部传感器的软件升级,存在(N*3)min不确定的安全隐患时间,N为升级的各类传感器的数量。

未使用安全升级系统之前,单个局部巷道共有P个传感器,每天升级M个传感器需要占用M*3分钟的升级时间,那么每天会造成系统稳定性下降程度大致为:

假设P = M,那么L约等于0.21%,可见不安全升级传感器软件对于系统的危害程度,假设每天工作的时间为8小时,那么对于人员的危害程度则上升到3倍。使用安全升级系统之后,升级软件造成的安全隐患(排除主板硬件故障的原因)就极大消除了。

3   结 论

综上所述,所论述的传感器软件安全升级方法具有较大的使用价值,可以最大限度避免程序升级造成的监测系统暂时失效的问题,可以减少传统软件升级所造成的系统风险,对保障安全生产具有较大的现实意义。

随着“十三五”规划落地,在国家建设智能矿山的政策背景下,安全生产将变得越来越重要,井下产品的使用维护升级在安全的环境安全检测状态下进行也变得尤为重要。

参考文献

[1]    朱贵国,汪党.基于STM32单片机的直流电机调速系统设计[J].数字技术与应用,2013,35(05):42-43.

[2]    朱仁义,李泓成,张辽.基于STM32单片机和SDRAM的模拟U盘设计[J].电子世界,2017,21(03):108-110.

[3]    胡广,谢中朝,胡健翔.基于STM32单片机的井下大容量储能装置的设计[J].电子质量,2015,31(06):17-18.

[4]    孟锦涛,刘淮霞. STM32单片机在室内监测研究[J]. 计算机产品与流通,2018,19(08):210-211.

[5]    范雪琴.基于STM32单片机的热量表低成本测温电路设计[J]. 苏州市职业大学学报,2014,37(02):87-89.

[6]    蒋昭颖. 基于STM32单片机的变频正弦信号发生器[J].电子设计工程,2016,27(05):31-33.

[7]    刘昕. 基于STM32单片机的高精度超声波测距系统的设计[J].电子制作,2013,26(16):237-238.

[8]    王工.指纹储物柜,可替代传统柜体的新型"保险柜"[J]. 大众投资指南. 2012,12(03):67-69.

[9]    张容娟.智慧校园中基于校园卡的智能储物柜设计[J].电子测试,2017,31(13):89-90.

[10]  马馨雅.基于STM32的指纹识别门禁系统[J]. 电子世界,2018,22(24):19-20.

[11]  王燕,戴剑峰,王祥华.STM32的条状指纹采集与拼接系统[J]. 单片机与嵌入式系统应用,2012,37(11):110-111.

[12]  刘榴,何英昊,李仁泽.基于STM32的简易智能家居控制系统设计[J]. 物联网技术,2016,29(11):90-91.