基于单片机的固件搬运功能的设计与实现

本设计要实现的单片机固件搬运功能,其实是实现单片机自己更新自己程序的过程,也就是固件更新。本设计利用STM32单片机运行速度快、片内资源丰富成本低和功耗低的特点,设计了一段固件更新的程序。首先论述了固件的概念和Boot Loader的应用以及原件的使用,其次论述了XModem协议,之后对STM32单片机内部的Flash进行预先规划。系统软件部分主要由Boot Loader程序、App程序组成,这些程序通过超级终端可以与嵌入式系统进行交互交互。Boot Loader程序和App程序使用C语言编写,具有非常好的可移植性和可读性。

关键词:固件;固件更新;STM32单片机;XModem协议;Boot Loader

Design and implementation of firmware based on MCU
Abstract
This design to achieve the MCU firmware handling function, in fact, is to achieve their own MCU update process, that is, firmware update. This design uses STM32 MCU running fast, rich resources, low cost and low power consumption, designs a firmware update program. Firstly, the concept of firmware, the application of boot loader and the use of the original are discussed. Secondly, the XMODEM protocol is discussed. Then, the flash in STM32 MCU is planned in advance. The software part of the system is mainly composed of boot loader program and app program, which can interact with the embedded system through the super terminal. Boot loader program and app program are written in C language, which has good portability and readability.

Key Words: Firmware; Firmware Update; STM32 MCU; XModem Protocol; Boot Loader

目 录

中文摘要与关键词…………………………………………………………………Ⅰ
Abstract and Key Words…………………………………………………………Ⅱ
引言……………………………………………………………………………………1
1.绪论……………………………………………………………………………1
1.1项目研究的背景与意义………………………………………………………1
1.2本论文研究的内容……………………………………………………………2
2.系统的相关技术理论………………………………………………………………2
2.1 固件及Boot Loader的基本概念……………………………………………2
2.1.1固件的基本概念及其重要性…………………………………………2
2.1.2 Boot Loader的基本概念及其作用……………………………………3
2.2 基本原件的介绍 ……………………………………………………………3
2.2.1 STM32F103系列单片机简介………………………………………3
2.2.2 RS485转串口…………………………………………………………4
2.3 XModem协议…………………………………………………………………5
2.4 超级终端………………………………………………………………………5
3.系统的分析与设计…………………………………………………………………6
3.1 固件搬运基本原理及Flash划分………………………………………………6
3.1.1基本原理………………………………………………………………6
3.1.2Flash的划分方式……………………………………………………6
3.2系统工作流程…………………………………………………………………7
4.系统的设计与实现………………………………………………………………8
4.1 硬件连线设计…………………………………………………………………8
4.2 Boot Loader程序设计………………………………………………………9
4.3 APP程序设计………………………………………………………………11
4.4 Xmodem程序设计……………………………………………………………12
4.4.1Xmodem协议控制符定义……………………………………………12
4.4.2Xmodem协议帧包格式………………………………………………12
4.4.3Xmodem校验和交互流程……………………………………………12
5.系统的调试………………………………………………………………………15
5.1 硬件连接图……………………………………………………………………15
5.2 调试……………………………………………………………………………16
6.结语……………………………………………………………………………18
参考文献……………………………………………………………………………19
致 谢…………………………………………………………………………20
附录1 …………………………………………………………………………21
附录2 ……………………………………………………………………………22
附录3 程序…………………………………………………………………………23

引 言
嵌入式产品已广泛应用于智能医疗、智能家居、智慧城市等领域。STM32单片机具有运行速度快、芯片资源丰富、成本低、功耗低等特点,因此国内很多厂家越来越多地使用它来开发嵌入式产品。在使用嵌入式产品的过程中,由于客户需求的变化和产品的升级,原有的程序需要重新编写[1]。所以本设计主要通过实现固件搬运功能设计的一款为解决固件更新的问题系统,并给出了具体实现过程。
1 绪论
1.1项目研究的背景与意义
单片机广泛应用于工业自动控制、仪器仪表等领域。一些仪器仪表的固件一直存在更新问题。而随着信息时代的来临,厂商的设计很难全面的满足客户需求,更多的厂商把更新固件提供更多更新的功能做为附加值来提供给用户。所以,固件更新对解决一些单片机更新问题很重要。
固件简单来讲就是操作系统的意思。因此,固件更新就是对系统进行更新。随着集成电路的发展,大部分固件都以Flash为载体,固件更新也变得越来越简单,越来越没有危险,固件程序与我们通常所说的程序的区别已经越来越小。
通过固件更新,可以进一步的优化和创新,使机器工作在更好的状态。例如更新安卓系统,每次的系统更新,都需要我们对系统进行固件更新才能完成。固件更新可以增加系统的某些功能。比如有的手机信号不好,可以通过固件更新,来得到解决。或者可以改变状态栏的样式、颜色等等。这些都是对手机某些部分功能的性能进行的更新。
所以,进行固件更新后,可以带来性能上的提升。随着周围软硬件环境的变化和更新,产品可能与许多新的软硬件不兼容。固件更新使硬件能够兼容更多、更新的软件和硬件,不断提高产品的兼容性。还可以增加新的功能,比如视频格式的增多,小游戏等等。总之,固件更新修正了以前版本存在的错误、漏洞或不足,增加稳定性。
另外,固件并非越新越好,只要够用,稳定就好,没有必要盲目追求新固件,同款产品的生产批次不同,硬件也有不同,后期固件无法兼容前期的硬件,盲目刷机可能导致一系列问题,最严重的会导致主板烧坏。
1.2本论文研究内容
本文的第一章是绪论,这部分介绍了论文的研究背景和意义和全篇论文的结构。
第二章介绍了相关技术理论,包括固件,Boot Loader的基本知识,和STM32F103的相关内容,简单介绍了XModem协议和超级终端。
第三章介绍了系统的设计原理和工作流程。
第四章介绍了系统的各个模块设计,包括硬件设计和软件设计。
第五章介绍了系统的调试步骤。
第六章为结余部分,对论文进行了总结及将来的研究发展进行了展望。

2 系统的相关技术理论
2.1 固件及Boot Loader的基本概念
2.1.1 固件的基本概念及其重要性
固件(Firmware)是指存储在嵌入式产品中程序存储器上的为嵌入式系统编写的程序组件,通过特定的程序进行刷新,可以实现更改嵌入式设备的功能或修复缺陷[2]。
在字典中,固件被定义为具有软件功能的硬件,在早期,这种类型的固件通常是ELOM或EPROM或其他东西。此外,这些硬件通常包含不能被用户直接读取或修改的程序。一般情况下,不需要升级固件。即使在固件中发现了严重的错误,原始机器上的EPROM也必须由具有良好编程的EPROM的专业人员替换。一般来说,执行系统最基本和最低级别工作的软件可以称为固件,例如计算机主板上的BIOS。在过去,更多的专业人士称之为固件。
2.1.2 Boot Loader的基本概念及其作用
Boot Loader在操作系统内核运行之前的一个小程序。通过这个小程序,可以对CPU、SDRAM、Flash、串口等硬件设备进行初始化,还可以将文件下载到系统板上,以擦除Flash和编程,真正起到引导和加载内核映像的作用。然而,随着嵌入式系统的发展,引导加载程序在基本功能的基础上逐渐得到扩展,引导加载程序可以增加板级对具体系统的支持,也就是增加一些硬件模块功能对使用的支持,以方便开发人员的开发和调试。
特别是在嵌入式系统中,引导加载程序依赖于硬件和实现。引导加载程序对于不同的硬件和不同的配置是不同的。不同的CPU也有不同的引导加载程序,有些支持多个CPU。嵌入式系统通常映射固态存储设备的地址,并且引导加载程序被放置在这个地址,这样当系统被重置时,程序可以首先执行。引导加载程序使用汇编语言和C语言的组合来编写程序。一旦它完成了它的工作,它就不再运行了。
2.2 基本原件的介绍
2.2.1 STM32F103系列单片机简介
STM32F103增强型系列由意法半导体集团设计,使用高性能的Cortex-M3,32位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和 20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设[]。所有型号的器件都包含2个12位的ADC,3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:多达两个I2C和 SPI、三个USART、一个USB 和一个 CAN。如图1为STM32F103的引脚图:在这里插入图片描述
在STM32系列的单片机中的Flash是64k,地址为(0x8000000~0x800FFFF),而且Flash本身就是分扇区的,一个扇区16KB的样子,具体可以查看手册。如图2为STM32F103C8T6芯片的Flash列表:在这里插入图片描述
Fig. 2 Pin figure
2.2.2 RS485转串口
RS485采用差分信号的负逻辑。逻辑“1”表示为两线之间的电压差为+(26)V。逻辑上的“0”表示为两线之间的电压差为-(26)V。RS485通信接口一种硬件描述的通信接口,它只需要两条通信线路,既可以在两个或两个以上的设备上进行数据传输。这种数据传输连接是半双工通信模式。在任何给定的时间,设备只能发送或接收数据。
2.2.3 USB转串口
USB转串口是实现计算机USB接口与通用串口之间的转换。作为应用最广泛的USB接口,是每台计算机必不可少的通信接口之一,其最大的特点就是支持热插拔、即插即用、传输速度快[3]。现代工业控制领域应用最广泛的应是RS232、RS485、并口接口。它有着悠久的发展历史,被广泛应用于许多领域。例如,一些编程爱好者在运行程序的时候会使用串口。还有一些系统如,机械控制系统,门禁控制系统等,都要使用RS232、RS485进行通信。
2.3 XModem协议
Xmodem协议是一种广泛应用于串行通信的异步文件传输协议。该协议以128块字节的形式传输数据,每个块都使用一个校验和程序进行错误检测。Xmodem协议传输由接收方和发送方完成。首先,接收程序发送协商字符来协商验证模式。协商通过后,发送程序开始发送数据包。接收程序接收到完整的数据包后,按照约定的验证方法对数据包进行验证。验证通过后,它发送一个确认字符,如果验证失败,它发送一个拒绝字符。发送端收到确认字符后继续发送下一个报文,收到拒绝字符后重新发送报文。
2.4 超级终端
超级终端和串口调试助手类似,是一种通用串行交互软件。但是串口调试助手接收数据时,不显示汉字,而超级终端可以显示汉字。如果在使用中需要显示汉字,使用超级终端就方便。超级终端的原理是随时将用户输入发送到串口,但不显示输入。它显示的是从串口接收到的字符。因此,嵌入式系统相应的程序应完成以下任务:将自己的启动信息和进程信息发送给运行超级终端的主机;将接收到的字符和需要显示的字符返回给主机。如图3所示,为本设计所用到的超级终端。 在这里插入图片描述
Fig. 3 Pin figure

3 系统的分析与设计
3.1固件搬运基本原理及Flash划分
3.1.1基本原理
本设计基于单片机开发技术,实现Flash中固件搬运,实际上就是用新的固件程序重写Flash,但根据不同的芯片及原理其实要分为两种方式。第一种方式是使用独立型的USB芯片的产品,对于这类产品,更新比较简单,也比较安全,只需要通过USB芯片将新的固件程序传送到Flash中即可。第二种是USB是主芯片的一部分,工作也需要固件的支持,对于这类产品,更新过程要比上一种复杂,并且也存在一定的危险性,因为一但更新失败可能会连最基本的USB传输功能都会丧失。所以,避开危险性,本设计选择独立型方式。
3.1.2 Flash的划分方式
所谓独立型就是专门划出一部分闪存Flash空间用来存储引导程序Boot Loader。本设计基于单片机开发技术,实现Flash中固件搬运。新固件存储与Flash备份区,符合特点给条件后将新固件由备份区搬运到执行去,并通过Bootloader的引导进入新固件运行相应功能。所以,可以将Flash划分为APP(用户应用程序)和Boot Loader(引导加载程序)两个区域。APP程序又可以分成Firmware A和Firmware B区。Firmware A区用来固定执行用户程序。当引导程序Boot Loader将接收到的新固件存入到Firmware B区,并校验成功后,Firmware A区中的用户程序将被擦除,然后Firmware B区的新固件将写入到Firmware A区中。Boot Loader区和APP区运行在Flash的不同区域,彼此互不干扰。STM32程序的起始地址是0x08000000,上电系统取地址0x08001000,对应Boot Loader区程序;Boot Loader区可以执行擦除、烧写App区,从而实现对App的升级。Flash的划分区域如图4所示:在这里插入图片描述
图4 Flash划分
Fig. 4 Pin figure
3.2系统工作流程
单片机上电之后开始执行Boot Loader程序,这是单片机检测用户是否有升级应用程序App的请求,固件更新之前,通常使用XModem协议串口方式,先在PC端使用超级终端工具准备好待更新固件,然后手动复位,进入Boot Loader引导程序。Boot Loader工程生成的.bin文件通常下载到ROM或Flash中的首地址,这样可以保证上电后先运行Boot Loader程序。而App工程生成的.bin文件则下载到ROM或Flash中Boot Loader后面的地址中。也就是说,存在ROM/Flash中的内容是分为两部分的。
具体固件升级的流程是:
(1)上电进入Boot Loader程序。
(2)Boot Loader查找升级文件的命令。
(3)上位机下发升级启动命令,设备响应升级启动成功,进行数据接收数据存储在固件更新区;每帧数据带CRC校验。
(4)数据接收完成固件内容校验成功后,将更新固件程序从固件更新区拷贝至用户区。
(5)程序跳转至最新的固件,固件升级成功。
当前运行程序接收到升级指令后,完成向引导程序Boot Loader的跳转,在 Boot Loader中实现对固件的接收和写入内部Flash中的更新区,当接收完成后计算代码和[4]。若接收文件的代码和理论代码和一致,则将用户区程序擦除,将固件区程序拷贝至运行区,继而实现程序的跳转切换,运行更新的程序[4]。若升级过程中,出现异常,导致升级失败,程序仍会跳转至原用户区,不影响正常工作。
工作的流程图如图5所示:在这里插入图片描述
图5 流程图
Fig. 5 Pin figure

4 系统的设计与实现
4.1硬件连线设计
这里使用的单片机是STM32F103C8T6,编译软件是Keil,STM32使用串口是 UART3,引脚是:PB10-TXD:接USB转串口的RXD(数据接收);PB11-RXD:接USB转串口的TXD(数据发送)。硬件连线比较简单,可以采用两种接线方式,第一种接线方式串口直接接线如图6;第二种接线方式接RS485转串口如图7:在这里插入图片描述
在这里插入图片描述
图7 接RS485转串口图
Fig. 7 Pin figure
4.2 Boot Loader程序设计
Boot Loader主要功能是有两个,一个是一定时间内判断是否需要更新App,如果需要则接收并将其烧写到指定地址的Flash空间中,并从该地址中获取栈顶指针和复位向量,并跳转到该函数执行;另一个就是超时直接在该地址直接获取之前的栈顶指针和复位向量并跳转执行。Boot Loader程序存储在STM32F103C8T6单片机内部Flash的0x08000000-0x08001000区域。系统上电或复位后, Boot Loader程序从0x08001000地址处开始执行。系统初始化完成之后,便读取升级标志信息。Boot Loader程序根据升级标志的值来判断是否需要更新程序,若进入升级状态。首先擦除App程序区域;然后循环接收更新的固件数据,将其写入指定的App程序区域;接收完成后修改升级标志的值,并执行跳转子程序以引导运行新版的App程序。若不需要升级,继续运行旧版的App程序。Boot Loader程序的流程如图8所示,其中跳转App程序和复位跳转到Boot Loader的C语言代码的主要部分如下:
int jumpAppBootLoader2App(void)
{
uint32_t uiInitSp;
uint32_t uiRstVector;
uiInitSp = *(uint32_t *)(JUAMP_APP_INIT_SP_ADDR);
if ( 0 != appFlashInitSpChk(uiInitSp) ) {
return -1;
}
uiRstVector = *(uint32_t )(JUAMP_APP_RST_VECTOR_ADDR);
if ( 0 != appFlashRstVectorChk(uiRstVector) ) {
return -2;
}
uart3Disable();
NVIC_SetVectorTable(NVIC_VectTab_FLASH,JUAMP_APP_NVIC_VECT_OF FS );
mspSet( uiInitSp );
((void (
)(void))uiRstVector)();
return 0;
}
int jumpAppApp2BootLoader(void)
{
appFlashNvicTableErase();
GLOBAL_INTERRUPT_DISABLE();
NVIC_SystemReset();
return 0;
}在这里插入图片描述
图8 Boot Loader流程图
Fig. 8 Pin figure
4.3 App程序设计
App为固件程序,App程序需要让编译器将程序存放在指定地址空间里,并重新定位中断向量表的位置。App程序除了执行正常的功能程序外,还能够时刻检测PC上位机发送过来的升级指令。当系统接收到升级指令之后,App程序首先要修改存储在升级参数区域的升级标记的值,然后进行复位,程序便重新从0x08001000处运行Boot Loader程序。App程序的流程如图9所示,参数设置如下:
(1)设置偏移向量表。需要在程序中使用库函数 NVIC_SetVectorTable();来设置偏移向量。
(2)设置软件复位方法。使用库函数NVIC_SystemReset();实现软件复位。在这里插入图片描述
图9 App流程图
Fig. 9 Pin figure
4.4 Xmodem程序设计
4.4.1Xmodem协议控制符定义
SOH是modem 128字节头标志,取值0x01。 STX是modem 1024字节头标志,取值0x02。EOT是发送结束标志,取值0x04。ACK是应答标志,取值0x06。NAK是非应答标志,取值0x15。CAN是取消发送标志,取值0x18。CRC 16是使用CRC16校验标志,取值0x43。
4.4.2 XModem协议帧包格式
XModem使用CRC16校验方式,如果使用XModem-1k或者 YModem,帧格式 Byte 4 - Byte 131 (128 字节) 需要增大为 Byte 4 - Byte 1027 (1024字节)。- Xmodem 如果使用校验和,帧格式 Byte 132 - Byte 133 只需要占用一个字节。- Byte 3是Byte 2按位取反,Byte 2取值范围 0 - 255,超过255后从0递增。
4.4.3 XModem校验和交互流程
首先,设置XModem初始化,然后设置XModem Tick主函数处理和中断接收处理函数,之后启动接收,等待处理,如果超时重新请求。在Tick完成处理之后,跳转到App,等待SOH,等待PackNumder,接收128字节数据,接收校验和。流程图如图10所示:
接收校验程序:
void xmodemRecvChecksumProc(uint8_t ucRecvData)
{
if ( ucRecvData == GsXmodemRunTimeData.ucCheckSum ) {
appFlashProgram( &GsXmodemRunTimeData.ucRecvData[0], GsXmodemRunTimeData.ucDataCnt );
XMODEM_DATA_SEND( XMODEM_ACK );
} else {
XMODEM_DATA_SEND( XMODEM_NAK );
}
GsXmodemRunTimeData.eRecvStat = EXMODEM_RECVSOH;
}在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
文摘要与关键词…………………………………………………………………Ⅰ Abstract and Key Words…………………………………………………………Ⅱ 引言……………………………………………………………………………………1 1.绪论……………………………………………………………………………1 1.1项目研究的背景与意义………………………………………………………1 1.2本论文研究的内容……………………………………………………………2 2.系统的相关技术理论………………………………………………………………2 2.1 固件及Boot Loader的基本概念……………………………………………2 2.1.1固件的基本概念及其重要性…………………………………………2 2.1.2 Boot Loader的基本概念及其作用……………………………………3 2.2 基本原件的介绍 ……………………………………………………………3 2.2.1 STM32F103系列单片机简介………………………………………3 2.2.2 RS485转串口…………………………………………………………4 2.3 XModem协议…………………………………………………………………5 2.4 超级终端………………………………………………………………………5 3.系统的分析与设计…………………………………………………………………6 3.1 固件搬运基本原理及Flash划分………………………………………………6 3.1.1基本原理………………………………………………………………6 3.1.2Flash的划分方式……………………………………………………6 3.2系统工作流程…………………………………………………………………7 4.系统的设计实现………………………………………………………………8 4.1 硬件连线设计…………………………………………………………………8 4.2 Boot Loader程序设计………………………………………………………9 4.3 APP程序设计………………………………………………………………11 4.4 Xmodem程序设计……………………………………………………………12 4.4.1Xmodem协议控制符定义……………………………………………12 4.4.2Xmodem协议帧包格式………………………………………………12 4.4.3Xmodem校验和交互流程……………………………………………12 5.系统的调试………………………………………………………………………15 5.1 硬件连接图……………………………………………………………………15 5.2 调试……………………………………………………………………………16 6.结语……………………………………………………………………………18 参考文献……………………………………………………………………………19 致 谢…………………………………………………………………………20 附录1 …………………………………………………………………………21 附录2 ……………………………………………………………………………22 附录3 程序…………………………………………………………………………23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值