Bootloader 固件升级步骤浅谈

一、Bootloader 概念及用处

1、BootLoader 是一段引导式程序,就是单片机启动时候运行的一段小程序,这段程序负责单片机固件的更新,也就是单片机选择性的自己给自己下载程序。可以更新,也可以不更新,在项目中,我们通常会对 FW 版本号进行对比,会将 MCU 中的 App 程序更新最新的版本,起到固件升级的效果。更新的话,BootLoader 更新完程序后,跳转到新程序运行;不更新的话,BootLoader 直接跳转到原来的程序去运行。

2、BootLoader 更新完程序后并不擦除自己,下次启动后依然先运行 BootLoader 程序,又可以选择性的更新或者不更新程序,所以 BootLoader 就是用来管理单片机程序的更新。

3、在实际的单片机工程项目中,如果加入了 BootLoader 功能,就可以给单片机后面升级程序留出一个接口,方便之后的单片机程序更新。BootLoader 工程生成的 .hex 或者.bin 文件通常下载到 ROM 或 Flash 中的首地址,这样可以保证上电后先运行ootLoader 程序。而 APP 工程生成的 .hex 或者 .bin 文件则下载到 ROM 或 Flash 中BootLoader 后面的地址中。也就是说,存在 ROM/Flash 中的内容是分为两部分的。

4、要实现在同一个 ROM/Flash 中保存两段程序,并且保证不能相互覆盖,则需要在下载程序时指定地址。

二、Bootloader 升级步骤

① 基本流程:


1、收到更新 FW 命令
2、进入 Bootloader 模式
3、被告知 FW 大小
4、更新 FW 退出
5、Bootloader 模式

② MCU 复位后代码运行步骤:

图一

步骤:首先进行芯片复位,引脚 BootLoader 功能启用或者 Bootloader 更新标志位置位为真来判断是否需要进行固件更新,我们通常使用后者来实现更新。如果要进行固件更新,则进入 Bootloader 模式并且等待新的映像更新到 MCU 中,如果标志位不为真,则进下一步判断主分区的映像是否存在,如果不存在,则要通过 Bootloader 下载一个新的映像进去。
如果主映像存在,则要判断主映像是否比备份区映像更高或者相同版本。
如果比备份区低版本,则要通过 Bootloader 将备份区的映像下载到主映像中,
如果这一步成功,则进行完整性检查并将备份区映像复制到主映像中,
如果这一步失败,则返回到开启 Bootloader 模式并等待新的映像。
如果在主映像比备份区高版本或者高版本的备份区复制到主映像这两种情况下,我们将通过 Bootloader 去运行目前的主映像中的代码。

在添加 Bootloader 功能时,最关键的部分是如何分配好每个部分的存储区域,从程序最开头地址是先运行 Bootloader 引导程序,这部分主要负责 FW 的更新,对内部 Flash进行擦除写入,对 App 分区内的程序进行版本更新。一般地,Bootloader 可分为单分区和双分区模式,常用的是双分区。双分区程序可分成以下三个部分:App 正在运行的程序部分、App 下载更新部分的程序、Bootloader 的引导程序。下载时的应用程序映像和引导加载程序代码在 FLASH 中共存。

③ Bootloader 单分区、双分区优缺点:

  • 双分区的优点是在进行固件更新的同时,鼠标或者键盘功能依旧可用,如果断电或者更新过程被打断,MCU 还是会跑之前保存的运行代码,可以理解成备份区代码,这个过程会通过 Bootloader 来实现。缺点是双分区太占用 Flash 内存,假设双分区 Bootloader 内存占 10 KB ,以 LPC5516 为例子,LPC5516 具有 256 KB 的 Program Flash,减去Bootloader 占用的内存以及 Bootloader 更新的标志位存放部分,约占用 2 KB 内存,因此 Flash 剩下 244 KB 的内存用来分配给运行代码以及备份区,这两个区所占用的内存是相同的,各为 122 KB,对于小内存的 MCU 来说,可编程空间很少,例如 LPC5512 的 Flash 为64 KB ,在做键盘功能时,基本不可能用双分区来实现固件升级。
  •   单分区的优点程序内存可用率高,能够存放更大的代码量,只需要一个分区就能实现固件升级,对之前版本的 FW 进行全部擦除和覆盖,不需要设置备份区。缺点是在进行固件升级时,如果对设备进行断电或者升级过程中发生了中断情况,导致整个升级过程失败,鼠标或键盘的功能将不能使用,重新上电也无法对设备进行重置,只能再次对设备进行固件升级操作才能成功使用。


三、Bootloader 升级组成部分

首先要另外开发一个 USB 通道,进行 Firmware 文件的接收、发送,以及实现设备与上位机的通信,创建一个带有 USB IAP 功能的头文件,可使用 Bus Hound 对设备发送数据来进行通道的验证。所需要用到的函数如下图所示:

图二

具体代码可以参考 LPC55 系列的 MCU,该系列的 SDK 中有 USB HID Generic 的例程,该例程是一个完整的通道,可以实现与 Bus Hound 的上位机通信过程。

在具体项目中,我们需要按照客户的需求来实现升级,所以要定制一个专有的协议,专门配置上位机软件的各种命令。上位机 APP 通常由客户开发,我们只需按照协议来完成通信接口即可。

这部分代码包含:USB 通道代码(专门用于上位机通信)、读写内部 Flash 、Firmware 数据包解析函数(负责数据包的处理以及实现所需的通信命令)、数据包校验CRC(校验数据包的完整性)等。

下图为数据包 CRC 校验表:

图三

四、总结

在项目中,为了方便后续代码版本的更新,我们会经常使用 Bootloader 来实现固件更新,原本的 ISP 烧录或者 JLINK 烧录对于产品的调试会带来不便,所以固件升级操作是相当重要的。通过以上的学习,能够让读者对 Bootloader 有一个基础的概念,可帮助开发者对具体代码框架有基本理解。后续我会推出更多关于 USB 以及 LPC 系列 MCU 的博文,请大家多多关注!

五、参考资料

【1】Firmware Update Using Secondary Bootloader.pdf

【2】LPC55S1X-LPC551X.pdf

【3】LPC551x User manual.pdf

【4】STM32 BootLoader 升级固件

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论