康燕萍 程小辉 黄鹏
摘 要: 研究一种基于STM32系列单片机实现IAP升级固件的方案,此方案对比ST官网IAP升级固件方案有较大的改进。电子产品出厂烧录固件时无需额外烧录BootLoader引导代码,出厂后的电子产品可使用USB线与电脑连接,通过USB接口把需要升级的固件拷贝到电子产品自带的外部FLASH中。STM32读取外部FLASH中的固件对自身的FLASH数据进行升级,整个升级过程中不受断电影响。此升级方案可应用于智能家居产品、医疗电子产品、智能家电产品等。
关键词: STM32; 在线应用编程; 固件; USB; 闪存
中图分类号: TN911?34; TP311 文献标识码: A 文章编号: 1004?373X(2017)22?0142?03
Abstract: A research scheme of IAP firmware upgrading based on SCMs in STM32 series is introduced, which is improved greatly in comparison with the IAP firmware upgrading scheme shown in ST official website. The electronic product factory doesn′t need to burn the BootLoader guidance code in its electronic products additionally when burning the products′ firmwares. The final electronic product is connected with computer via USB cable. The firmware needing upgrade is copied into the external FLASH built?in electronic products through USB interface. The FLASH data of the firmware itself in external FLASH is read by means of STM32 for upgrade, and the whole upgrade process isn′t affected by power outage. This upgrade scheme can be applied to the intelligent household products, medical electronic products and intelligent appliances.
Keywords: STM32; IAP; firmware; USB; FLASH Memory
0 引 言
STM32控制器内嵌ARM Cortex?M3内核,具有高性能、低成本、低功耗等特点,受到越来越多电子开发人员青睐。STM32具有IAP功能,可实现用户或售后技术人员对出厂后的电子产品进行固件升级。
IAP的具体应用可通过不同方式实现。对比文献[1]方案和ST官网的IAP方案:文献[1]方案与ST官网的IAP方案相同,将BootLoader代码存放在FLASH中,执行BootLoader之前先将BootLoader代码拷贝到单片机的RAM中执行,对整片FLASH进行数据升级[1];ST官网方案的缺点是固件升级过程中不能断电,如果断电将损坏原有的固件,导致STM32不能正常启动。文献[2?3]在ST官网的方案上进行改进,BootLoader代码存放在FLASH中,并在FLASH中执行BootLoader代码,固件升级时跳过BootLoader代码存储区,对BootLoader存储区域之外的FLASH进行数据升级,确保BootLoader代码的完整性,可解决固件升级过程中断电损坏原有固件的问题[2?3]。但使用PC机的超级终端中的Ymodem协议通过串口发送固件。此方案在使用过程中存在较大的局限性,其要求PC机必须要有串口。如果PC机有串口,那么使用IAP升级的意义不大,因为通过串口可使用STM32已固化的BootLoader代码进行ISP操作。文献[4?5]对方案进一步改进使用SD卡或USB接口进行固件升级,这样可以解决PC机串口局限性问题[4?5],但仍然使用两个固件的方案,对于产品生产而言增加了固件烧录的工作量,也不便于固件的维护。文献[6]对两个固件进行手工合并,将两个固件合并成一个固件,可以解决固件烧录的工作量大的问题[6]。但是由于手工操作,降低了固件合并的可靠性。文中方案对比上述方案有进一步改进。文中的改进方案在程序设计时也使用两个工程,但最终将BootLoader程序工程的固件通过编译器链接到应用程序工程代码中,最终生成一个固件,减少产品生产烧录固件的工作量。由于固件合并是由编译器自动完成,增加了固件合并的可靠性。IAP升级固件时通过PC机的USB端口拷贝固件到电子产品的外部FLASH中,然后进行升级固件,解决了PC機要求有串口的局限性。BootLoader存放在0x08000000~0x08004FFF地址区域,上电后先执行BootLoader代码,满足条件才跳转至应用程序执行,固件升级过程中跳过BootLoader存储区域进行数据升级,保证BootLoader代码的完整性,解决了固件升级过程中断电损坏固件的问题。若STM32为互联型产品可通过U盘连接到电子产品USB端口进行升级固件。文中以STM32F103VCT6[7]控制器为例,对IAP升级固件方案做详细介绍。
1 硬件设计框图
文中介绍的IAP升级固件方案需要一定的硬件电路支持。支持IAP升级固件的硬件框图如图1所示。endprint
由图1可见所需要的硬件电路比较简单:需要将STM32F103VCT6内嵌USB模块的USB接口引出,用于连接PC机传输数据;增加一个外部的FLASH存储器。AT45DB041的最大存储容量[8]为528 KB。此容量应大于STM32的FLASH容量,在IAP升级固件过程中用于存储要升级的固件。
2 程序设计
2.1 程序架构
程序设计时分为两个工程,分别为BootLoader程序工程和应用程序工程,程序架构如图2所示。
BootLoader代码里需要包含SPI驱动,AT45DB041器件驱动,Fats文件系统。BootLoader代码是通过检查AT45DB041存储器中是否存在update.bin文件来判断是否需要进行固件升级操作。由于BootLoader代码最终需要链接到应用程序中执行,应用程序的中断被重新映射到0x08005000地址开始,因此BootLoader代码里面需要关闭所有中断,SPI模块也只能通过查询方式进行数据收发。
应用程序中需包含SPI驱动,AT45DB041器件驱动,Fats文件系统,还需包含USB驱动。应用程序执行过程中,若有用户需要对电子产品进行固件升级,应用程序将启动USB模块,将电子产品用USB线连接到电脑,将固件改名为update.bin后拷贝到AT45DB041的模拟U盘中,重启后可执行固件升级操作。
2.2 FLASH存储区域划分
STM32F103VCT6为大容量产品,具有256 KB FLASH,48 KB RAM[7]。256 KB的FLASH存储区共分为128页,每页大小为2 KB。将存储区域分为两部分,地址0x08000000~0x08004FFF共20 KB空间用于存放BootLoader代码,地址0x08005000~0x0803FFFF共236 KB的空间用于存放电子产品实现功能的应用程序代码。BootLoader程序代码与应用程序代码用两个不同的工程编译。BootLoader编译完成之后生成bin固件,使用IAR编译器链接到应用程序的工程文件中,最后生成一个最终的bin文件。最后的这个文件为产品生产或产品固件升级的程序固件。STM32 FLASH区域划分如图3所示。
2.3 固件升级流程
STM32系列的MCU上电启动后会自动跳转到0x08000000地址开始执行[9]。由于BootLoader代码位于0x08000000地址开始,因此每次上电都应开始运行BootLoader代码。在BootLoader代码里检查是否有升级固件文件,若有则进行升级操作,升级完成后将固件文件删除;若没有则跳转至应用程序代码执行[10]。固件升级工作流程如图4所示。升级固件时需要注意一下几点:
(1) 打开update.bin文件后读取前20 KB数据丢弃,因为前20 KB数据是BootLoader代码,此部分代码不需要升级。
(2) 升级固件时应该从0x08005000地址开始写FLASH,不能对0x08000000~0x08004FFF的地址区域进行写FLASH操作,此区域为BootLoader代码区域,如果进行写操作,则会导致整个固件损坏[11]。
3 IAR编译器相关配置
3.1 icf文件配置
每一款芯片的程序使用IAR编译器编译时都会使用到一个.icf后缀名的文件。此文件的作用是定义芯片的内存区域,一般情况下不需要修改此文件。STM32F103VCT6的FLASH被划分为2个区域,分别用于存放不同功能的程序代码。为了能将程序代码存放到指定的FLASH区域,需要修改icf文件。由于BootLoader代码与应用程序为不同的程序工程,因此需要修改2份icf文件。BootLoader程序工程的icf文件修改如下:
3.2 bin文件链接
改进方案的优点在于将BootLoader的bin文件使用IAR编译器链接到应用程序的工程中,最终生成一个bin文件。减少产品在生产上的程序烧录工作和程序维护工作。将BootLoader工程生成的bin文件改名为bootloader.bin。并将此文件拷贝到应用程序的工程目录下。然后打开应用程序工程,在workspace窗口选择工程名,单击鼠标右键选择Option?>Linker?>Input。Bin文件链接配置如图5所示。
Keep symbols可随意填写,文中填写bootloader,此处与下面的symbols编辑框填写一致。由于bootloader.bin放置在应用程序工程目录文件路径应该填写$PROJ_DIR$\bootloader.bin。Section编辑框填写.bootloader,与icf文件中配置的一致。链接后对工程进行编译,如果不报错,说明链接成功,可打开.map文件查看链接bin文件的地址分配。
4 结 语
经测试可用此方案对STM32F103VCT6进行固件升级。固件升级过程中对电子产品进行人为断电,重新上电后可继续重新升级,不受断电影响。整个固件升级过程需要约1 min。对此方案还可进行延伸改进,如果STM32為互联型产品,USB可支持OTG功能,可使用U盘连接到电子产品,将固件文件从U盘中拷贝到AT45DB041中,无需PC机参与。也可将AT45DB041改用SD卡,先将固件文件拷贝到SD中,再将SD卡插到电子产品中进行固件升级。
参考文献
[1] 陈峰峰,胡毅,许艳.STM32F10x在应用中编程的实现方法[J].单片机与嵌入式系统应用,2009(9):25?27.
[2] 张舞杰,南亦明.基于STM32F103VB的应用编程技术的实现[J].计算机应用,2009,29(10):2820?2822.
[3] 李兴鹤,蔡亮,宋吉波,等.STM32用户基于IAP的程序更新技术[J].单片机与嵌入式系统应用,2012(1):74?75.
[4] 王党利,宁生科,马保吉.基于STM32F10x引导程序实现USB在应用中编程[J].应用天地,2010,29(11):68?70.
[5] 颜秋男,胡毅.STM32F103VB的SD卡在应用编程设计[J].单片机与嵌入式系统应用,2012(2):29?31.
[6] 唐小平,廖美英,张祥.基于STM32平台的IAP设计实现[J].兵工自动化,2014,33(9):94?96.
[7] 陈宫,王三胜,张庆荣,等.基于STM32F103VCT6的微位移控制系统设计[J].现代电子技术,2012,35(3):144?146.
[8] 张杏珍,孙健.IC卡芯片AT45DB041的原理及应用[J].现代电子技术,2005,28(10):17?19.
[9] 程霄.基于边坡监测系统的无线传感器网络关键技术研究[D].重庆:重庆大学,2014:56.
[10] 周天兵,刘国忠.单片机程序远程升级技术[J].仪表技术,2011(9):25?27.
[11] 李静波.嵌入式系统固件升级的设计[J].今日电子,2013(10):53?55.endprint