APP下载

基于STM32的Bootloader实验系统设计

2019-11-28顾东袁傅晓婕陈爱军

实验技术与管理 2019年11期
关键词:固件应用程序嵌入式

顾东袁,傅晓婕,陈爱军,卢 瑾

基于STM32的Bootloader实验系统设计

顾东袁1,傅晓婕2,陈爱军1,卢 瑾1

(1. 浙江工业大学 信息工程学院,浙江 杭州 310023;2. 浙江长征职业技术学院 计算机与信息技术系,浙江 杭州 310023)

设计了一套基于STM32的Bootloader实验系统。该系统主要完成引导加载和用户交互两大功能,存储方式采用“多系统存储”的结构设计,引导加载过程中设计了3种不同的工作模式,用户交互部分分权限设计了不同的指令。该系统为不同层次的学生提供相应难度的实践锻炼,引导学生巩固理论知识、积极探索、提高创新能力。

嵌入式系统;实验系统;STM32;Flash

嵌入式系统是一门把“硬件、软件融合在一起”和具有较强实践性的课程,传统的8051单片机教学和“ARM+Linux”的嵌入式教学方式亟待改进,当前嵌入式已成为消费电子领域的主流技术,课程实验的内容更应体现互联网、物联网时代的最新应用[1]。

随着近年来物联网的飞速发展,具有联网功能的智能硬件设备不断涌现,设备中的固件需频繁在线更新,在此类应用中Bootloader发挥着非常重要的作用[2-4]。目前Bootloader大多针对高性能处理器和存储器资源充裕的嵌入式平台,功能强大、全面,但相对复杂[5],对于实验教学来说很难做到让学生全面、深入地了解,大多仅停留在使用层面,无法满足实验教学的要求[6-7]。

为此,本文结合当前主流的高性能、低成本、低功耗的STM32微处理器,设计了一套面向低端嵌入式平台的Bootloader实验系统。该系统采用“多系统存储”的结构设计,同时结合物联网应用中的特点,对传统的引导加载过程进行了优化调整,进一步保证嵌入式硬件设备运行可靠性。考虑到实验中的难易程度,在软件实现上对一些操作进行了函数封装供学生调用,满足不同层次学生的实验要求。

1 工作原理和实验平台

1.1 Bootloader工作原理

嵌入软件系统一般由引导加载程序(Bootloader)和用户应用系统这两部分代码构成,Bootloader是设备上电后最初要运行的代码[8]。一般首先要完成硬件资源的初始化,实现处理器内部寄存器和部分相关设备的初始化,使其处于确定和可访问状态。初始化完成后,Bootloader系统会主动获取设备的状态,并根据各状态选择直接引导至用户应用系统或启动Bootloader主程序,进入用户交互界面。其引导基本过程见图1。

图1 Bootloader程序引导过程

1.2 实验硬件平台

在嵌入式系统应用环境中,Bootloader对于硬件配置有很强的依赖性。因此,在嵌入式应用环境中建立一个通用的Bootloader几乎是不可能[8-9]。实验过程中将使用自制的STM32实验开发板作为硬件平台,实物图见图2。该实验开发板主要面向互联网创新应用实验和学生创新实践,采用了ST公司基于ARM Cortex-M4内核的STM32F427作为主控MCU,该MCU具有高达180 MHz处理速度和1 MB片内存储,同时配置了片外Flash存储和TF存储。片外Flash存储采用华邦SPI Flash芯片W25Q64,将用于存储程序和数据的容量扩展到了8 MB;TF存储使用常见的micro SD卡,利用MCU提供的SDIO接口实现。上述硬件资源的配置完全满足Bootloader实验开展的基本要求。

图2 实验平台设备实物图

2 系统设计

2.1 总体框架

以往Bootloader通常需完成用户程序引导和升级固件下载两块功能,升级固件下载一般通过USB DFU协议和串口YModem协议等方式实现[10-11]。但在物联网、互联网相关应用中,原本Bootloader中的升级固件下载功能基本移到了用户应用程序中实现,Bootloader仅需在系统重启后完成新程序的引导[12]。这样可大大简化Bootloader的设计,同时可应用于更多的低端MCU中。

本文设计的Bootloader系统主要完成引导加载和用户交互两大功能,存储方式采用了“多系统存储”结构设计,可有效地避免因程序更新失败或其他问题导致嵌入式设备无法启动。Bootloader整体的架构如图3所示,交互指令主要以选单(菜单)的方式提供管理、模式设置等功能;引导加载根据参数标志位进行应用程序的重定位;系统在无法进行正常引导的情况下,可恢复出厂设置。

图3 Boot Loader架构图

2.2 存储分区设计

根据“多系统存储”结构设计和实验硬件平台的特点,将实验开发板中的STM32F427微处理器片内的1 MB Flash分为Bootloader引导加载程序区32 KB、应用程序1区384 KB、应用程序2区384 KB、参数区16 KB以及保留区128 KB,片外W25Q64的8 MB Flash存放出厂固件程序512 KB和参数备份区16 KB。存储分区结构如图4所示。

(1)引导加载程序区为Bootloader引导程序,地址为0X08000000-0X08007FFF。

(2)参数区分2块存储,一块位于片内Flash,紧跟Bootloader引导程序,地址为0X08008000- 0X0800BFFF;另一块为参数的备份区,位于片外Flash,紧跟出厂固件程序,地址为0X080000-0X083FFF。

(3)应用程序区分3块区域存储:位于片内Flash中的应用程序1区和应用程序2区,用于升级过程中固件的切换;片外Flash存储出厂固件,主要用于固件备份。应用程序1区地址0X08020000—0X0807FFFF,应用程序2区地址0X08080000—0X080DFFFF,出厂固件地址0X000000—0X07FFFF。

图4 存储分区图

参数区中存储的各个参数由应用程序与Bootloader引导程序共同维护,作为两部分程序通信的桥梁。参数区中各字段含义见表1。

表1 参数区各字段含义说明

2.3 交互指令

在Bootloader程序启动并完成必要的硬件资源初始化后,等待串口的输入信息执行不同的指令。系统提供了如表2所示的各类指令。同时考虑到有些指令除了使MCU更好地工作外,也能破坏MCU正常运行及代码的保护,系统中设置了普通和管理员两种工作权限。

表2 菜单功能说明表

2.4 引导加载流程

引导加载是Bootloader的核心功能,系统中将加载过程分为3种模式:正常模式、升级模式和异常模式。执行流程如图5所示,通过检查参数区中的FlagUpgrade和EnableAPP来决定执行的动作。

图5 引导加载执行流程

(1)正常模式。正常模式中不对参数区中的参数做任何修改,只根据有效APP号在取得应用程序的首地址后实现跳转。

(2)升级模式。在应用程序中已实现了新固件的下载、校验和存储,该模式中仅需更改参数区的有效APP号,再执行正常模式的流程。

(3)异常模式。当两块应用程序区都无法正常运行时,通过异常模式进行预置出厂固件的恢复。该模式中将片外出厂预置的固件拷贝至片内应用程序1区,并更改参数区的各参数,最后通过软复位重启设备。如遇预置的出厂固件有问题时,可通过外部TF卡内的固件恢复到出厂固件区,作为最后一道安全保障。

3 软件设计

本系统开发环境选用MDK KEIL工具软件,采用C语言编程。考虑到学生实验过程中对代码的可复用性,对核心部分的实现代码进行了不同程度的封装,整个Bootloader的软件开发包含了大量的参数逻辑判断、Flash操作和程序跳转,对该部分内容做了重点优化设计。

3.1 参数结构体

在Bootloader整个过程中,大部分地方都涉及各类参数的读取、更新等操作。为了使代码结构更为清晰、简洁,对图5中的各参数用结构体进行如下封装:

typedef struct _PARM_CONFIG{

uint8_t ucFlagUpgrade;/*升级标志位*/

uint8_t ucEnableAPP; /*当前有效APP号*/

uint32_t unAPP1Version;/*应用程序1区固件版本号*/

……

}parm_config;

3.2 Flash操作

整个开发过程中涉及到片内、片外的Flash写入、擦除、读取操作,考虑到STM32的Flash操作比较繁琐、复杂,对Flash的3种操作进行了函数封装,学生只需传入必要的参数即可实现,让学生的注意力更多地集中在Bootloader工作流程上。

Flash擦除函数:IoT_Flash_Erase(eiot_partition partition, uint32_t off_set, uint32_t size);

Flash写入函数:IoT_Flash_Write(eiot_partition partition, volatile uint32_t* off_set, uint8_t* inbuffer, uint32_t inbuffer_length);

Flash读取函数:IoT_Flash_Read(eiot_partition partition, volatile uint32_t* off_set, uint8_t* outbuffer, uint32_t outbuffer_length);

3.3 程序跳转

程序跳转是Bootloader最基本且最重要的功能,参照官方STM32的IAP技术原理,使用汇编语言编写[13],跳转函数为Iap_Load_App(uint32_t appxaddr)。

void Iap_Load_App(uint32_t appxaddr){

if(((*(vu32*)appxaddr) & 0x2FFE0000) == 0x20000000){

/*确定复位中断向量起始地址*/

MSR_MSP(*(vu32*)appxaddr);

Jump_to_App(); //跳转到用户程序

}

}

4 实验结果

实验过程中,需事先编写好2个简单的应用程序bin文件,如通过GPIO控制LED灯的常亮和常灭,并将编译好的bin文件通过仿真器烧录到起始地址为0X08020000和0X08080000两块区域中。计算机通过USB数据线与开发板的串口USB连接,使用串口助手进行监听,实验场景如图6所示。Bootloader程序启动后会在串口助手中打印出提示信息并等待用户指令的输入,根据输入不同的指令实现所设计的功能,最终实现用户应用程序的引导。图7为普通权限的指令界面,图8为管理员权限指令界面,实现了应用程序区和出厂固件区中固件的相互拷贝复制功能。

图7 普通权限的指令执行界面

.

5 结语

基于STM32的Bootloader实验系统已在本科生创新实践环节和研究生必选的工程实践课中应用,取得了良好的效果。通过设计不同难度梯度的实验内容,可适用不同层次的学生,也为学生在既定的实验内容下预留了一定的拓展空间。该实验系统紧密结合物联网、互联网相关应用,能很好调动学生的积极性,通过实际动手操作来巩固嵌入式系统等课程的理论知识,引导学生积极探索、提高其创新能力。

[1] 周世杰,李玉柏,李平,等.新工科建设背景下“互联网+”复合型精英人才培养模式的探索与实践[J].高等工程教育研究,2018(5): 11–16.

[2] 李强,罗超,夏威,等. FPGA远程更新系统[J].仪表技术与传感器,2014(7): 72–74.

[3] SHEN L, LI N, WANG S. Optimization on ZigBee OTA Technique[C]//Advanced Information Management, Communicates, Electronic & Automation Control Conference. IEEE, 2017: 119–122.

[4] KANG Y, CHEN J, LI B. Generic Bootloader Architecture Based on Automatic Update Mechanism[C]//2018 IEEE 3rd International Conference on Signal and Image Processing (ICSIP). IEEE, 2018: 586–590.

[5] GUO J, CHEN W. BOOTLOADER Analysis Construction and U-BOOT Porting Based on S3C2440[C]//2018 2nd IEEE Advanced Information Management, Communicates, Electronic and Automation Control Conference (IMCEC). IEEE, 2018: 1893–1897.

[6] 陈凯,魏文博,邓明.嵌入式系统教学实验板开发[J].实验技术与管理,2016, 33(1): 82–85.

[7] 姚莉,倪波.基于OBE的嵌入式Linux系统开发课程教学改革研究[J].软件导刊(教育技术),2017, 16(12): 7–11.

[8] 范蟠果,邢保毫,米晓亮,等.基于嵌入式S3C2440系统Bootloader设计与实现[J].计算机测量与控制,2016, 24(9): 12–14.

[9] KANG Y, CHEN J, LI B. Generic Bootloader Architecture Based on Automatic Update Mechanism[C]//2018 IEEE 3rd International Conference on Signal and Image Processing (ICSIP). IEEE, 2018: 586–590.

[10] 邓中亮,孙静.嵌入式设备在线系统升级的设计与实现[J].计算机工程与设计,2009, 30(13): 3085–3087.

[11] 陈绍炜,魏刚,王子. TMS320C6416程序以太网远程更新技术研究[J].现代电子技术,2014, 37(12): 125–128.

[12] CHANDRA H, ANGGADJAJA E, WIJAYA P S, et al. Internet of Things: Over-the-Air (OTA) firmware update in Lightweight mesh network protocol for smart urban development[C]// Communications (APCC), 2016 22nd Asia-Pacific Conference on. IEEE, 2016: 115–118.

[13] “STM32F427/437”[EB/OL]. [2019-01-16]. https://www.st.com/ en/microcontrollers/stm32f427-437.html?querycriteria=productId=LN1789.

Design of Bootloader experimental system based on STM32

GU Dongyuan1, FU Xiaojie2, CHEN Aijun1, LU Jin1

(1. College of Information Engineering, Zhejiang University of Technology, Hangzhou 310023, China; 2. Department of Computer and Information Technology, Zhejiang Changzheng Vocational and Technical College, Hangzhou 310023, China)

A set of Bootloader experimental system based on STM32 is designed. This system mainly completes two functions such as the boot loading and user interaction. The storage mode adopts the structure design of “multi-system storage” to design the three different working modes in the boot loading process and set up different instructions in the user interaction part with different privileges. This system provides practical exercises with corresponding difficulty for students at different levels, and guides them to consolidate theoretical knowledge, actively explore and improve their innovative ability.

embedded system; experimental system; STM32; Flash

TP368.2;G642

A

1002-4956(2019)11-0089-05

10.16791/j.cnki.sjg.2019.11.022

2019-03-11

浙江省自然科学基金项目(LY16F050009);浙江省公益技术应用研究计划项目(2017C33149);浙江工业大学创新性实验项目(“基于互联网的积木式嵌入式系统实验设计”);浙江工业大学课堂教学改革项目(KG201814)

顾东袁(1980—),男,浙江海宁,硕士,实验师,主要研究方向为嵌入式系统、物联网技术。E-mail: star918@163.com

猜你喜欢

固件应用程序嵌入式
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
删除Win10中自带的应用程序
TS系列红外传感器在嵌入式控制系统中的应用
谷歌禁止加密货币应用程序
搭建基于Qt的嵌入式开发平台
基于SHA1的SCADA系统PLC固件完整性验证方法
基于固件的远程身份认证
英特尔发布免费固件引擎
提取ROM固件中的APP
倍福 CX8091嵌入式控制器