张岩松,葛俊锋,叶 林,胡文月
(华中科技大学 自动化学院,湖北 武汉 430074)
基于STM32的程序远程升级设计与实现
张岩松,葛俊锋,叶 林,胡文月
(华中科技大学 自动化学院,湖北 武汉430074)
随着各类嵌入式设备的广泛应用,对嵌入式设备程序升级的需求也愈发强烈。文中在阐述“在应用中编程(In Application Program,IAP):原理的基础上,以STM32为平台,设计了通过以太网升级程序的方案,实现了以STM32为代表的嵌入式设备程序固件的实时升级,满足了相关需求,更为物联网和智能化设备的功能完善提供了指导和帮助。
IAP;STM32;程序远程升级;物联网
IAP是除ICP和ISP外一种方便快捷的应用程序更新方法。用户可以在远程无需通过机械操作实现对目标板程序的实时更新操作,通信方式可以选择串口、以太网、WIFI等多种方式,可以有效解决在远程苛刻条件下用户程序不能及时更新的问题。该技术提高了嵌入式系统的可拓展性与可维护性,在物联网项目中具有实际应用价值。文中首先介绍了IAP的工作原理、程序流程及烧写细节,并以此为基础,分别对STM32系列微控制器的互联型和非互联型两大类MCU产品设计了远程程序升级方案,实现了对STM32全产品类的程序升级支持,即可通过以太网远程实时升级STM32上的用户程序。
表1 STM32启动模式Tab.1 Start mode of STM32
图1 储存器映像Fig.1 Memory map
1.1储存结构
STM32是一种32位微处理器[1],共有4GB线性地址空间,分为8个主要存储块,每个块512MB。其中第一块为代码区,内部包括嵌入式闪存、系统存储区、选项字节等。第二块内部包含嵌入式SRAM区等。系统的外设地址及厂商定制的外设地址分布在其余存储块中。
对于STM32,可以通过BOOT[1:0]引脚选择3种不同启动模式。
一般来说,程序的代码文件及常量存储在闪存存储器,程序的变量、堆栈存储在SRAM区。程序文件的大小受闪存及SARM的限制,用户程序的代码文件及常量占用存储区的大小要小于闪存存储区总容量,用户的变量及堆栈占用内存的大小要小于STM32的SARM容量。否则,程序不能运行或运行时发生崩溃。
表2 互联型STM32储存器组织结构Tab.2 Memory structure of the STM32 connectivity line
不同型号的STM32闪存储存器容量不同[2],分为小容量(16K-32K)、中容量(64K-128K)、大容量(256K-512K)以及互联型(105及107系列微控制器);而按照不同容量,储存器组织成32个1K字节/页(小容量)、128个1K字节/页(中容量)、128个2K字节/页(互联型)、256个2K字节/页(大容量)的主存储器块和一个信息块。
1.2基本原理
IAP即是在正在运行程序的微控制器上对其闪存区部分进行烧写[3],烧写完成后,微控制器的程序指针及堆栈指针重定向,指向新写入的程序代码段和重新初始化的堆栈,执行新程序,从而实现程序的在线升级。要实现IAP功能,需要两个项目程序代码,第一个项目程序代码可以定义为装载程序,第二个项目程序代码可以定义为用户程序。两个项目程序文件分别存储在人为划分的两个不同闪存存储器存储区。特别的,也可以同时存在多个用户程序文件,分别存储在由人为划分的闪存存储器的不同分区中。当闪存存储区存储多个程序文件时,微控制器在同一时刻只能单独执行一个项目程序,当需要升级用户程序或要执行其他用户项目程序时,需要微控制器执行跳转,执行目标程序代码。
2.1装载程序
IAP的实现有赖于一个逻辑清晰、代码简明的装载程序,负责管理和更新用户程序。微控制器上电或者复位后,系统首先执行启动程序,启动程序的工作即是初始化堆栈及微控制器内核,对于STM32来说,即是其CM-3内核,完成初始化工作后,系统开始执行main函数,在main函数中,首先判断在闪存中指定地址设置的标志位是否被改写[4],若已被改写,则说明用户程序文件已成功烧写至指定闪存存储器区,则接下来执行程序跳转,程序指针重定向并指向用户程序文件起始地址,堆栈指针指向用户堆栈的起始地址,对于实现IAP功能的微控制器来说,装载程序与用户程序共用同一段SARM空间,所以在执行程序跳转过程中,在确定堆栈指针指向堆栈起始位置的同时,要清空堆栈以留出空间供用户程序使用。若闪存中指定地址设置的标志位未被改写,则说明需要对用户程序进行更新,则下一步执行时钟和外设的初始化,完成初始化后开始接收待更新的用户程序文件,直至接收完成。完成对用户程序文件的接收后则开始在预先人为设定的位置烧写用户程序文件至闪存存储器。确定烧写完成且无误后,改写在指定地址设置的标志位,执行软件复位。微控制器复位后重新对标志位进行判断,这时闪存中指定地址设置的标志位已被改写,系统跳转执行新的用户程序,整个程序更新工作完成。
图2 装载程序流程图Fig.2 Flow chart of the boot software design
程序跳转的代码如下:
//定义pFunction为函数指针数据类型
typedef void(*pFunction)(void);
//取出闪存指定地址中的数据
//判断取出数据是否与设定标志位数据相同
//判断用户代码的堆栈地址是否落在 0x20000000~ 0x2001ffff区间中,即小于RAM的128K容量
//取堆栈的栈顶地址
//取复位地址
//强制类型转换为程序指针
//将用户代码的栈顶地址设为栈顶指针
//设置程序指针为复位地址
其中,USER_FLASH_FLAG_PAGE_ADDRESS为用户设定的闪存存储器指定标志位地址,USER_FLASH_FLAG_ VALUE为用户设定的闪存标志位数据内容,USER_FLASH_FIRST_PAGE_ADDRESS为用户设定的烧写用户程序文件到指定的闪存存储区的起始地址。STM32上电后后检测BOOT引脚的电平来决定程序指针的位置,如BOOT设置为FLASH启动,启动后微处理器会先取两个地址:一个是栈顶地址,另一个是复位地址。
2.2用户程序
用户程序除了负责实现用户目标功能外,还要配合装载程序,在接收升级命令后实现对装载程序的跳转[5]。一般地,当一个项目程序开始响应一个中断后,系统会自动定位一张向量表,并且根据中断号从表中找出中断服务程序的入口地址,然后跳转过去执行。而在这里的用户程序中,中断向量表的起始地址与原闪存中存储的中断向量表已发生偏移,所以中断向量表需要重定向,即配置向量表偏移量寄存器,使之指向新的向量表。在用户程序的开始首先完成中断向量表的重定向,接着对系统进行初始化,然后完成用户程序目标功能,在这个过程中,用户程序利用中断或者轮询一直在监听串口命令,若得到升级程序命令则擦除闪存存储器中指定位置设置的标志位,进而执行软件复位,使系统开始执行装载程序。
图3 用户程序流程图Fig.3 Flow chart of the user software design
要实现系统软件复位,一般有3种方法:看门狗超时引起复位、软件复位、自编汇编代码。3种方法本质上相同,这里具体介绍利用库函数软件复位的方法:
__set_FAULTMASK(1);
NVIC_SystemReset();
__set_FAULTMASK()是系统封装的汇编代码,参数为1时执行FAULTMASK复位;FAULTMASK是一个只有1个位的寄存器。当它置1时,只有NMI中断才能响应,所有其他的异常,包括硬fault中断都被屏蔽。NVIC_SystemReset()是STM32库函数,实现系统软件复位。STM32为实现软件复位专门划出了一个寄存器用来做这种软件复位功能,即SCB-> AIRCR寄存器。我们只需置位该寄存器的SYSRESETREQ位即可把内核送往系统复位发生器的请求线置为有效,从而引起整个芯片系统的复位。一般从SYSRESETREQ被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。为防止处理器进入其他中断服务程序,最好在发出复位请求前,先把FAULTMASK置位。
2.3程序文件的生成和烧写
装载程序和用户程序的代码经过编译、链接生成可执行文件,而最终烧写进闪存中的程序文件一般需要特定的文件格式。hex文件和bin文件是烧写程序常用的两种文件格式,其中hex文件包含地址等信息,而bin文件只包含数据本身,所以在烧写hex文件时,一般不需指定地址,而烧写bin文件时,需要指定烧写的地址。
由于hex文件用ASCII来表示数据,且文件中包含其他附加信息,hex文件一般大于bin文件。在升级程序时,用户程序一般采用bin文件格式。一般通过MDK软件可以直接生成hex文件以及.axf文件,利用MDK软件自带的格式转换工具fromelf.exe,可以实现.axf文件到.bin文件的转换。当然也可以通过J-Flash ARM软件转换文件格式,在转换为bin文件时,可以看到bin文件的起始地址和终止地址,以及在文件各个地址中存储的数据。
对STM32内部闪存进行烧写,需要遵循以下流程:闪存解锁,清除相关标志位,擦除闪存,写入闪存,锁定闪存。程序文件的烧写与标志位的烧写本质上相同,都是按照规范的流程进行文件的擦除和烧写,其中程序文件在全部接收后烧写到指定闪存存储区,而标志位由用户指定,在程序头文件中定义,烧写至装载程序和用户程序占用存储区域之外的特定地址,一般为闪存存储区末端,这样可以有效的避免程序文件覆盖标志位的情况出现。
STM32系列微控制器分为非互联型及互联型,主要区别在于互联型内部集成了以太网模块,可以利用片上运行的嵌入式TCP/IP协议栈进行网络数据包的收发。针对两种型号存在的差异,分别设计了合适的方案。
3.1非互联型方案
本方案采用大容量STM32作为实验平台,预留一路串口作为升级程序的命令及接受文件的通信通道,通过TTL转RS232或者RS485的芯片转换为RS232或RS485信号,进而与网络模块的通信,对于非互联型的STM32,要实现远程的通信,一定要借助相应的网络模块或网络芯片,将串口数据转换为网络数据再联入以太网[6]。相关芯片如Wiznet的W5100、W5500系列芯片,内嵌TCP/IP协议栈,可以通过SPI与微控制器通信,并可外接RJ45联通网络。相关模块也有较多的公司开发,如联创科技公司的TCP-232模块。模块的另一端通过RJ45连接网络双绞线联入以太网,也可与终端PC直连,终端PC有相应的通讯上位机。
本方案适合已经在广泛应用中的非互联型STM32,可以通过串口与联网模块通信,从而实现通过以太网升级用户程序。应该注意的是,由于芯片的型号不同,芯片的闪存大小和内存大小也不尽相同,设计时要考虑清楚。
3.2互联型方案
对于互联型STM32,微处理器本身内置以太网模块支持通过以太网收发数据,包括一个符合802.3协议的MAC(介质访问控制器)和专用的DMA控制器。该模块支持默认的独立于介质的接口(MII)和精简的独立于介质的接口(RMII),可以与外接的物理层(PHY)芯片直连,外部以太网PHY芯片与标准RJ45接口连接,目标板可以直接以网络双绞线接入以太网。在另一端,连接终端PC的网络双绞线联入同一网络,即可实现终端PC对目标板的实时程序更新[7]。
LWIP协议是瑞典计算机科学院开发的开源轻量型TCP/ IP协议栈。LWIP协议栈支持UDP、TCP等协议。LWIP协议减少了内存使用率和代码大小,使LWIP协议适合在资源有限的嵌入式系统中应用[8]。
移植到STM32内的LWIP协议栈可以完成方案所需的通讯需要。在本方案中,利用应用层协议HTTP(超文本传输)协议,以微控制器所在硬件平台为Web服务器,而终端PC作为Web客户端,通过网页浏览器实现对微控制器用户程序文件的升级。
无论是非互联型方案还是互联型方案,其程序升级的原理、装载程序与用户程序的流程以及程序固件的烧写在本质上是相同的。在考虑了芯片的存储结构、硬件差异之后,该方案同样适用于其他类型的微控制器。
本文介绍了STM32系列控制器的储存结构、IAP的基本原理,并以此为基础对STM32系列微控制器的互联型及非互联型产品都相应的设计实现了通过以太网更新程序的方案。此种方式具有方便灵活,简单易用的优点。未来,在物联网、可穿戴智能设备上该技术有更广泛的应用前景。
[1]Joseph Yiu.宋岩译.ARM Cortex-M3权威指南[M].北京:北京航空航天大学出版社,2009.
[2]意法半导体 (中国)投资有限公司.STM32参考手册[EB/ OL].www.stmcu.org,2010.
[3]姜晓梅,李祥和,任朝荣,等.基于ARM的IAP在线及远程升级技术[J].计算机应用,2008(2):519-521.
[4]阙凡博.基于stm32的程序远程升级设计[J].仪器仪表用户,2013(5):90-92.
[5]李兴鹤,蔡亮,宋吉波,等.STM32用户基于IAP的程序更新技术[J].单片机与嵌入式系统应用,2012(1):74-75.
[6]张舞杰,南亦民.基于STM32F103VB的应用编程技术的实现[J].计算机应用,2009(10):2820-2822.
[7]Qingqing Xu.A design and implement of IAP based on HTTP[J].2011 International Conference on Computer Science and Service System,2011(6):1918-1922.
[8]Adam Dunkels.Design and Implementation of the lwIP TCP/ IP Stack[J].Swedish Institute of Computer Science,2001.
[9]董昊,石九龙,刘锦高.基于STM32F103的贴片机控制系统的设计与实现 [J].电子设计工程,2014(4):158-161,165.
[10]江洋,刘宇红,韩云杰.基于STM32的智能家居系统应用研究[J].电子科技,2014(4):105-107,111.
[11]蔡光昭,洪远泉,周永明.基于STM32的超声波测速测距系统设计[J].现代电子技术,2014(24):87-89.
Design and implementation of remote program upgrade based on STM32
ZHANG Yan-song,GE Jun-feng,YE Lin,HU Wen-yue
(Department of Automation,Huazhong University of Science and technology,Wuhan 430074,China)
With the wide application of the embedded device,the demand for upgrading the program for embedded devices is increasingly strong.In this paper,a new method to upgrade program in STM32 by the network is proposed after introducing the principle of the IAP.In this method,the firmware of Embedded devices such as STM32 can be upgraded in real time.IAP not only meets the relevant needs,but also provides the guidance and assistance to the improvement of Internet of Things and the intelligent equipment.
IAP;STM32;remote program upgrade;Internet of Things
TN98
A
1674-6236(2016)01-0131-04
2015-05-27稿件编号:201505244
国家自然科学基金资助项目(61104202);中央高校基本科研业务费专项资金资助项目(2014QN170)
张岩松(1991—),男,辽宁北票人,硕士研究生。研究方向:传感器与智能检测技术。