基于485总线的STM32远程固件更新与实现

2022-12-01 01:06刘鹏飞徐明阳邢宇鹏
计算机测量与控制 2022年11期
关键词:固件通信协议上位

陈 峰,刘鹏飞,徐明阳,伍 能,邢宇鹏,谢 征

(中国电子科技集团公司第三十四研究所,广西 桂林 541004)

0 引言

STM32系列微控制器具备性能高、成本低、功耗低、兼备实时功能和数字信号处理等特点,使其成为嵌入式应用设计的首要选择,以高集成度和开发简单著称的ARM Cortex-M0、M3、M4以及M7内核的控制器,已在消费电子、网络应用、工业控制和安全产品等场景中被广泛应用[1-5]。STM32F103系列是ST公司发布的基于ARM Cortex-M3 32位内核的微控制器芯片。其中STM32F103RCT6是增强型微控制器,高达72 MHz的工作主频,是同类产品中性能高好的产品,片内Flash和RAM的容量分别为256 k和48 k,具有64个IO端口以及集成SPI、UART、ADC和TIMER等模块,同时具备十分丰富实用的外设[1-3],可满足一般工业设计和生产对微控制器经济性和实用性需求,使其成为微控制器中的理想器件。

RS-485总线是一种串行总线推荐性标准(RS,rcommended standard),采用平衡驱动器与差分接收器的方式进行信号传输[5]。由于RS-485总线具有布线简单、传输距离远、支持节点多(32个)、传输线成本低以及抑制共模干扰能力强的特性,使得RS-485成为工业应用中数据传输的首选标准,被广泛应用在汽车电子、电信设备局域网、航空电子、智能控制、环境监测等领域中[16-21]。然而当RS-485总线节点上的STM32设备需要进行软件升级或软件维护时,将设备一一拆装,逐一采用编程器进行嵌入式软件更新,将会十分耗费人力、物力和时间。更为致命的是,有些设备一旦集成完毕后,甚至不允许拆卸,就算将每台设备的下载口都连接到设备外壳上,由于使用环境因素的制约,有时候人工已经无法触及到设备,这将给设备的升级维护带来极大的困难与挑战。为了解决RS-485总线上设备固件更新困难的问题,本文提出基于RS-485总线,采用应用内编程IAP(in-application programming)的方式[6-12]对设备进行远程固件更新的方法,为STM32控制器在线升级提供一个方便快捷、稳定可靠的解决方案。

1 系统构成

RS-485串行总线允许一对双绞线上一个发送器驱动多个负载设备,由于发送和接收共用同一组物理信道,在任何时刻只允许一台设备处于发送状态,其它设备必须在总线上信号已经发送完成后才能进行应答。在本系统中,PC端为主设备,即主机,经USB转RS-485模块后连接到485总线上。其余设备为从设备,从设备出厂时自带有系统内部唯一的设备流水号,根据系统容量,流水号分别固化为1到N。主设备需要与从设备进行通信时,所有的从设备都接收到主设备发送的数据信息,由于通信协议上携带设备流水号信息,只有流水号正确的设备才能进行响应。基于485总线的系统构成如图1所示。

图1 系统构成示意图

在基于RS-485总线的系统中,传输路径上如果存在不连续阻抗或者出现阻抗不匹配的现象,极易引起信号传输过程中的电磁反射,反射的电磁场与原磁场叠加,将使传输信号出现畸变,极易导致通信过程出现误码。因此,需要在总线远端线路上增加端接电阻,通常端接电阻的阻值为120 Ω,利用端接电阻来吸收噪声并减少电磁反射,可以大幅度提高RS-485通信的可靠性[5]。

由于RS-485为半双工通信方式,采用主-从结构方式进行通信时,总线通信受主机控制,从设备不能主动发送命令或数据,所有的通信都应由主机发起,各从设备之间也不能相互进行通信。这种通信方式限制了不能对系统中的设备进行统一集中升级。因此,在对系统中设备进行固件在线升级时,只能逐一对设备进行升级,且在升级过程中不能对其它设备进行操作,否则有可能会引起RS-485总线竞争,导致远程固件更新不成功。

2 STM32远程固件更新方案

2.1 STM32固件更新方式

通常对STM32进行固件更新的方式有以下3种。

1)在电路内编程ICP(in-circuit programming):ICP是STM32电路调试时最为常用的,一般有两种调试方式,分别是JTAG仿真调试和串行单线调试SWD。标准的JTAG协议接口需要4根信号线(TDO、TDI、TCK、TMS)和硬件复位RST信号,JTAG主要用于芯片内部测试;而SWD需要2根信号线,分别为SWCLK和SWDIO。由于SWD方式具备调试速度快、占用IO口少的特点,因此,在电路板调试时,通常利用MDK等编译工具以及STM32 ST-LINK Utiliyt下载助手等工具,便可实现通过SWD协议接口下载器更新固件。

2)在系统内编程ISP(in-system programming):使用ISP方式更新固件不需要下载器,是使用STM32系统存储器中自带的自举引导程序(bootloader)进行烧录,可以通过STM32控微制器的接口,例如USB/UART/SPI/I2C/RS-485/CAN等,利用微控制器接口接收数据并将其内部的APROM、数据闪存(DataFlash)和用户配置(Config)区域进行更新。无论是电路板上的空白控制器还是已经编程过的微控制器,都可以通过系统内编程的方式达到固件更新的目的。

3)在应用内编程IAP(in-application programming):通过通信接口实现在线固件更新,它不需要使用任何工具,仅仅是通过软件的方法来更新FLASH中的数据,即利用用户编写的引导程序在运行过程中对User Flash的部分区域进行在线电擦除和再编程[9]。因此,IAP需要在程序设计时编写两个项目工程,第一个项目程序作为更新引导程序,执行对第二部分真正用户代码的更新或超时跳转至用户程序,以实现器件固件更新功能以及用户程序的正常启动[7-16]。

使用ICP升级固件时,需要将常用的下载工具,比如JLINK、ULINK、CMSIS-DAP、STLINK等通过下载线缆连接到目标器件的下载接口上,该方法是硬件调试阶段较为合理的器件固件更新方法。当硬件调试结束封装成模块或设备后,后期如果需要再次更新固件时,就必须对设备进行拆装或者将每一个设备的下载口引到设备机壳外部,这样都不利于总线上设备的高效升级。ISP的优势是不需要编程器就可以实现STM32的设计和开发,该技术通过器件出厂时自带的升级引导程序,原则上支持远程固件更新,但是在升级时需要对器件启动模式进行选择,不可避免地引入对硬件的物理连接操作。一般ISP的步骤为:电脑通过USB转232线连接控制器的USART1,打开下载软件,设置跳线或使用按键,使控制器的BOOT0为高电平,BOOT1为低电平,从而复位控制器使其进入bootloader模式,通过下载软件更新程序,程序更新完毕后,再将BOOT0设置为低电平,确保器件重启后从内部FLASH启动程序。ISP模式的引导程序是器件出厂时自带的,使用固定的硬件接口,用户无法对其进行修改和重定义,这也在一定程度上限制了ISP方式的大量应用。而IAP远程固件更新则完全不需要对器件进行任何额外的硬件连接操作,IAP技术从结构上将Flash存储器划分成两个相互独立的存储区域,一个区域用来存放升级引导程序Bootloader,另外一个区域用来存放用户应用程序。IAP升级引导程序是由用户编写的,可根据实际使用需求选择不同的硬件外设以及自定义数据传输协议,相对ISP的方式,IAP方式在升级时,显得更加灵活方便。IAP的一般实现过程为:设备上电后首先进入引导程序,引导程序在确认无固件更新需求后跳转到用户应用程序。当需要对总线上的某一台设备进行固件更新时,可向该设备发送软件重启命令,使其再次进入升级引导程序,接收来自主机的待升级固件数据,并写入控制器指定的Flash区域,待所有数据接收完毕并编程成功后跳转到新程序入口地址,执行新写入的程序,达到远程固件更新的目的。

2.2 IAP远程固件更新方案

2.2.1 IAP实现技术原理

IAP的实现技术原理如图2所示,其IAP实现过程如下。

1)STM32微控制器在复位后,首先从基地址0x0800 0000开始启动,然后从内部闪存地址0x0800 0004取出复位中断向量的地址,并跳转到IAP复位中断服务程序[2-4],在运行完复位中断服务程序之后跳转到IAP中main(void)函数。IAP的main(void)函数的主要功能是启用时钟、初始化串口以及解除存储区域的写保护等,当需要升级固件时按协议规范接收固件数据并写到相应的FLASH区域;当不需要升级时跳转至0x0800 0004+N+M处执行真正的用户APP(User-application)程序;

2)IAP代码执行结束之后,即新的用户APP代码已成功写入STM32的FLASH中,此时,用户程序的复位中断向量表起始地址变为0x0800 0004+N+M,取出新程序的复位中断向量表的地址,并跳转执行新程序的复位中断服务程序,随后跳转至用户APP的main(void)函数[2-4];

3)在用户APP的main(void)函数执行过程中,如果微控制器得到一个新的中断请求,PC指针仍强制跳转到地0x0800 0004中断向量表处,而不是用户程序的0x0800 0004+N+M中断向量表处[2-4];

4)执行完步骤1)后,程序再根据设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,在执行完新的中断服务程序后,程序返回用户程序main(void)函数继续运行程序[2-4]。

图2 IAP实现技术原理图

2.2.2 Flash空间分配

将STM32启动模式配置为用户Flash启动,控制器Flash区域划分如图3所示。根据IAP和用户程序占用空间大小,将IAP升级引导程序存放于0x0800 0000起始的12 kB地址空间中,当系统上电后,先从0x0800 0000进入IAP升级引导程序,等待升级固件确认信号,在规定时间内设备接收到升级信号,则进入升级处理程序,否则将程序跳转至用户应用程序。升级引导程序和用户程序Flash空间分配具体设置如下。

1)引导程序空间设置:在MDK编译器的Target options-Target标签下的IROMl的起始地址设置为0x0800 0000,空间大小配置为0x2FFF;

2)用户程序空间设置:在MDK编译器中将IROMl的起始地址设置为0x08003000,并将剩余空间分配为用户程序区,最重要的是在用户程序main()函数中添加中断向量表地址偏移量:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x3000),或者在system_stm32f10x.c文件下重新定义中断向量表偏移量:#define VECT_TAB_OFFSET 0x3000,以确保用户程序部分从0x8003000开始启动,不会与IAP程序空间造成冲突。

图3 Flash区域划分示意图

2.2.3 数据传输协议设计

在数据传输时使用自定义通信协议,以提高固件更新过程中的抗误码性能。传输协议见表1和表2。其中,上位机到设备端通信协议中,第1、2字节为帧头,第3、4字节为待传输数据包总长度,第5、6字节为当前传输帧序号,第7字节为设备流水号,第8字节为命令字,用命令字定义所需要执行的具体操作,第9到N字节为所携带的数据,传输升级固件数据时,数据段固定长度为256字节,其它类型数据长度根据实际需求确定,以避免不必要的开销。然后是校验位,采用和校验的方式,将第3到N字节数据进行和校验,最后两个字节为帧尾。设备到上位机通信协议与上位机到设备通信协议基本一致,不同之处在于第9字节表示命令执行结果标识,用0x00表示命令执行失败,0xFF表示命令执行成功。

表1 上位机到设备通信协议

表2 设备到上位机通信协议

固件更新时主机向待升级设备发送一帧数据,等待设备返回信息或返回信息超时。设备根据帧头、帧尾以及校验位判断当前帧是否接收成功,并将执行结果上报主机。如果当前帧接收正确,主机将发送下一帧数据,否则将当前数据帧重新发送,当同一数据帧发送次数大于5时,终止发送,此时判断设备或通信出现故障。当固件更新过程中出现异常情况时,用户程序区域有可能已遭受破坏,此时将无法正常启动用户程序。但是,由于升级过程中不会对引导程序部分区域进行操作,因此可通过断电重启设备的形式,对设备再次进行更新升级即可。

2.2.4 上位机软件设计

Visual C++6.0在可视化编程和数据管理方面功能十分强大,它以类和事件驱动为核心,具有程序框架自动生成、代码编写和界面设计集成交互操作的优点,非常适合于嵌入式软件人员进行上位机软件的编程[18-22]。因此上位机控制程序采用VC++6.0设计,利用Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,各个控件的触发转换为相应的协议数据处理,实现串口通信功能。通信接口具体配置为:波特率:9 600,校验位:无,数据位:8位,停止位:1位。上位机控制软件主要实现的功能包括通信串口号配置、设备流水号设置、确认更新、下载或上传固件、启动用户程序、软件重启、发送文件、执行用户程序以及一些升级过程中的关键辅助信息提示。上位机程序操作界面如图4所示,程序界面简洁直观,指引性强,易于操作,即便是对软件、硬件一点都不熟悉的人员,都能通过该界面轻易地实现设备的远程固件更新。

图4 上位机程序操作界面

2.2.5 生成目标下载固件

MDK编译器将嵌入式程序代码经编译后一般生成AXF格式文件,经配置编译选项后,也可以生成HEX和BIN格式文件。AXF文件是编译器默认生成的目标代码文件,它不仅包含了有效代码数据,而且还包含了全部调试信息,通常在MDK进行在线调试时使用该文件。一般情况下,AXF格式文件并不适合用来当作待升级固件文件。而HEX和BIN文件都是由AXF格式文件生成的,属于AXF文件的简化版本,HEX格式文件的数据内容如图5(a)所示。HEX文件使用十六进制符号表示的数据记录,其数据具体定义见表3。以图5(a)第二行为例,表明该行数据长度为0x10字节(N=0x10),地址偏移量为0x3000,数据类型为0x00,表示该数据为普通数据,从0xD0到0x08的16个字节为数据内容,即需要写到0x8003000起始地址的具体数据值,最后一个字节是校验和,用来检验数据的准确性。

表3 HEX文件数据定义

由于HEX格式文件在数据上增加了额外的开销,数据量较多、文件所占空间通常较大,而BIN文件是最小可运行的文件,其包含了最直接的代码映像,BIN格式文件数据内容如图5(b)所示。从第一行可以看出,其第一个数据字节是0xD0,第十六个字节为0x08,刚好与HEX文件中第二行的数据部分完全一致。因此,固件程序文件选择BIN文件,以尽量减少升级过程中传输的数据量,提高升级效率。由AXF到BIN文件转换需要在MDK编译器上添加类似如下命令:fromelf--bin-o".in_file@L.bin" "#L"。值得注意的是,固件选用BIN格式文件时,由于BIN格式文件不携带地址信息,烧写数据时,必须从设置好的地址偏移量开始烧录,否则将会导致升级后的程序无法正常运行。

图5 HEX和BIN格式文件构成

2.2.6 固件更新详细流程

STM32远程固件更新详细流程如图6所示。在点对点通信模式下,设备上电后初始化系统,首先进入IAP升级引导程序,向主机发送开机提示操作信息并检测串口输入,等待主机发送确认升级固件字符“Y”。如果在3秒时间内主机没有返回执行信息或返回的信息不是字符“Y”,则执行超时操作,自动切换到用户程序运行。在规定的时间内一旦接收到确认升级字符,程序跳转到固件更新主菜单,提示下一步操作选项,可选择固件更新、固件上传或切换到用户程序。

图6 IAP固件更新流程图

若主机回复“1”,选择固件更新,则设备端按照通信协议按帧接收固件数据,对数据进行校验,并将接收成功与否信息返回主机。当某一数据帧接收失败或检验失败时,重传该帧,重传次数不大于5次。由于所使用STM32的Flash每一页的大小为2 k,因此每校验完2 k的数据,便将该数据按页写入对应的Flash地址空间。当所有的数据接收完毕后从设备回复主机接收成功信息,否则回复主机接收失败。

若主机回复“2”,选择固件上传,则将0x0800 3000开始的数据读出,并按照上位机到设备的通信协议上传数据,以获取当前设备内部的程序备份。

若主机回复“3”,选择切换到用户程序,设备跳转至0x0800 3000处执行用户应用程序软件,系统将正常启动设备。

在RS-485总线模式下,需要对设备进行固件更新时,首先发送指令使待升级设备软件重启,然后微控制器强制从复位中断向量0x0800 0004处进入IAP程序,提示主机执行下一步操作。由于在通信协议中包含了设备流水号信息,因此只有被选择固件更新的设备才正常响应主机的命令,并与主机建立通信连接,再利用点对点的通信模式实现固件更新。

3 IAP远程固件更新实现

IAP远程更新RS-485总线上STM32设备固件的具体操作步骤和方法如下。

1)固件更新前准备工作:从电脑上打开上位机软件,检查确认当前电脑与设备通信所使用的串口号,在上位机软件的串口配置中选择正确的串口号,并打开该串口。此时,上位机软件将经电脑通过USB转RS-485总线与设备建立物理通道连接关系,固件更新准备工作就绪;

2)选择待升级设备:当总线上的设备需要升级固件时,上位机软件首先选择该设备对应的流水号,例如需要升级5号设备的固件,将设备流水号“5”写入串口配置里的流水号空白框中,选择软件重启,将重启5号设备;

3)5号设备重启后,首先进入IAP升级引导程序,设备初始化完成后向上位机发送升级主菜单提示信息,如图7(a)所示,为防止误升级,设备返回升级主菜单中包括了该设备的SN码,流水号等信息,并提示是否需要对该设备进行升级。在核对设备的流水号信息无误后,在规定时间内点击“确认更新:Y”按键进行确认升级操作;

4)设备接收到确认升级的回复后,将返回下载菜单操作提示信息,如图7(b)所示。提示本次操作是固件更新、固件上传还是启动用户程序。根据下载提示信息,此时应选择“1、固件更新”选项,等待发送固件数据;

5)在文件选择选项中添加待更新固件.BIN文件所在目录,然后选择发送文件,上位机将按照已定义的传输协议将固件数据分包下发,并在接收到正确接收回复后发送下一数据包,控制软件在信息提示框中打印数据包发送及接收的状态信息,同时通过进度条显示固件更新的实时进度情况。固件更新过程如图7(c)所示。待固件数据全部更新完成后,设备发送接收成功通知,并再次返回下载菜单,此时可以选择“执行用户程序”或断电、软件重启设备,设备将按照新固件运行用户程序,至此固件更新完毕。

图7 远程固件更新操作过程示意图

由上述远程固件更新操作流程可知,通过IAP远程固件更新技术,利用编写的上位机控制软件,对RS-485总线上设备远程升级的过程操作简单、方便快捷,仅仅需要几个简单的人机交互过程就可以实现在线设备的固件更新,不但省去了拆装设备、接插线缆等操作所带来的麻烦,而且提高了设备升级维护的效率。经长期验证考核表明,使用该远程固件更新方案,包文传输出错几率极低,固件升级成功可靠性高,取得了良好的实用效果。

4 结束语

本文介绍了RS-485总线及STM32控制器在应用中编程的技术原理和技术特点,设计了STM32控制器固件在线更新的技术方案,编写了远程固件更新上位机控制软件,解析了编译器生成的程序文件具体数据形式,确定了待更新固件的格式,采用自定义串口传输通信协议,确保了数据传输过程中的有效性,实现了STM32微控制器的远程固件更新和维护。实践应用表明,通过VC++编写的上位机控制软件,结合自定义串口通信协议实现的IAP远程固件更新,固件更新过程操作简单便捷,程序运行稳定可靠,解决了RS-485总线上STM32设备固件更新困难的问题,具有极为广泛的应用前景。

猜你喜欢
固件通信协议上位
尼康旗舰Z9升级新固件延长高速连拍时间
特斯拉 风云之老阿姨上位
车载网络通信协议标准化问题研究
电动汽车充电接口及通信协议新国标发布
基于ZigBee和VC上位机的教室智能监测管理系统
基于固件的远程身份认证
英特尔发布免费固件引擎
提取ROM固件中的APP
基于R8C的汽车OBD通用故障诊断仪设计
SIP协议系统模型的形式化研究