欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > bootloader固件升级开发原理

bootloader固件升级开发原理

2025/9/8 15:45:10 来源:https://blog.csdn.net/Dustinthewine/article/details/142318810  浏览:    关键词:bootloader固件升级开发原理

固件升级

  • 前言
  • 一、什么是固件升级
  • 二、固件升级流程
  • 三、固件开发流程
    • 1. UART升级
      • (1)bootloader开发
      • (2)app开发
    • 2. CAN升级
      • (1)CAN盒
      • (2)主控板
    • 3. 无线升级

前言

在实际企业中,对产品进行软件上的更新迭代,不再会像你在学校里头用st-link或者j-link等烧录器对单片机进行直接擦写,而是会将一个产品编写两套代码(BootloaderAPP),APP是你对产品实际需要设计的代码,Bootloader则是用于给APP代码做引导写入到单片机的指定地址。

一、什么是固件升级

首先讲讲什么是固件,固件是固化在集成电路内部的程序代码,负责控制和协调集成电路的功能,通俗易懂来说固件就是你用项目编译器(keil、iar、ccs等)生成的bin文件,然而你需要将这个bin文件写入到mcu内部flash指定地址,即该代码数据固化在该mcu中。
其次什么是固件升级呢?在知道什么是固件之后,固件升级就顾名思义了,所以固件升级就是对原固件进行更新迭代,将新的固件数据重新写入到指定地址处。

二、固件升级流程

这里我会以一套完整的产品固件升级流程来讲。
首先,开局你手里会发一块开发板、烧录器、usb线和俩套代码,并且也会有相应的升级上位机给到你。

  • 第一步,用烧录器给开发板烧录bootloader代码,用于引导app代码升级
  • 第二步,打开指定上位机,通过usb连接开发板串口,导入app工程编译生成的bin文件,开始升级,等待升级完成

即固件升级如上两步,则以后更新只需要导入新的bin文件即可。

三、固件开发流程

知道固件升级流程之后,那么开发流程就好理解了。

1. UART升级

(1)bootloader开发

在bootloader这套代码中最主要的工作就是引导升级。在固件升级整个结构上来讲,bootloader扮演的是上位机和app之间的中间件,负责数据写入存储,接收上位机发过来的升级信息写入到APP。

在bootloader中主要任务就是接收上位机的升级信息,然后写入到app运行地址,那么在实际软件上该如何设计呢,如下(这里不示例代码,只讲原理):

系统初始化:
1. 初始化看门狗        ----     系统异常重置
2. 初始化定时器        ----      中断喂狗
3. 初始化链路串口      ----     与上位机交互
4. 初始化内部flash     ----     写固件信息固件升级过程:上位机                             boot
5. 扫描设备                     <--->      ack
6. 开始升级信号(文件大小)       <--->      ack
7. 升级(包索引+包大小)         <--->      ack,写入flash(固件数据)
8. 升级结束信号                 <--->      ack,写入flash(升级完成标志)
9. 重启设备信号                            ack,系统复位
10.重启后会先进入boot开始地址,对flash自检,若升级完成标志置位+app地址数据不为空,则跳转地址(app开始地址)                 

(2)app开发

接着上节写,这时app固件已被成功写入,即mcu上电会直接跳转到app地址运行,那么此时如果你还想继续迭代软件又该怎么固件升级呢?所以在app段也需要一条链路与上位机交互,并且在接收到app发过来的开始升级信号时,则启动系统复位并更改升级标志,这时程序被跳转到了boot地址,这样就可以重新升级了,具体设计原理如下:

系统初始化:
1. 初始化看门狗        ----     系统异常重置
2. 初始化定时器        ----      中断喂狗
3. 初始化链路串口      ----     与上位机交互
4. 初始化内部flash     ----     写固件信息
固件升级过程:上位机                             app
5.  扫描设备                     <--->      ack
6. 开始升级信号(文件大小)       <--->      ack,升级标志置位,系统复位(跳转到boot开始地址)上位机                              boot
7. 升级(包索引+包大小)         <--->      ack,写入flash(固件数据)
8. 升级结束信号                 <--->      ack,写入flash(升级完成标志)
9. 重启设备信号                            ack,系统复位
10.重启后会先进入boot开始地址,对flash自检,若升级完成标志置位+app地址数据不为空,则跳转地址(app开始地址) 

以上是常见的固件升级原理,但有些产品串口资源受限,也考虑成本,无法腾出一个串口用于升级,并且用串口升级速率较慢且为点对点升级还需要考虑到丢掉等因素,所以还有一个很为常见的固件升级方式,速率快并且可以一对多,那就是CAN升级方式。

2. CAN升级

首先我先来介绍一下CAN升级又是怎样的升级架构,为“上位机+中间件+主控板”,有了上面的基础,即可知道该中间件负责接收上位机发过来的升级信息,然后再将其转发给主控板,主控板收到信息,回应给中间件,最后由中间件上传到上位机。因为是CAN方式升级,所以我们通过把该中间件称作“CAN盒”,因为在实际产品上它也就是被封装成一个小黑盒,那么具体设计原理如下可见:

(1)CAN盒

系统初始化:
1. 初始化看门狗        ----     系统异常重置
2. 初始化定时器        ----      中断喂狗
3. 初始化链路串口      ----     与上位机交互
4. 初始化CAN          ----     与主控板交互工作过程:上位机                CAN盒                      主控板
5. 发送扫描设备信号      接收上位机信号转发给主控板     回应扫描信号给CAN盒接收主控板信号转发给上位机。。。。。                                         。。。。。。。

可见,CAN盒在升级过程总完全是作为一个数据转发的作用

(2)主控板

系统初始化:
1. 初始化看门狗        ----     系统异常重置
2. 初始化定时器        ----      中断喂狗
3. 初始化CAN          ----     与主控板交互
4. 初始化内部flash     ----     写固件信息工作过程:上位机                   主控板
5. 发送扫描设备信号        		 回应
6. 发送开始升级信号			     回应,置位升级标志,系统复位,跳转到boot执行					    
7. 升级信号						 回应,写入flash
8. 结束信号						 回应,置位升级标志
9. 重启设备信号                   回应,系统复位
10.重启后会先进入boot开始地址,对flash自检,若升级完成标志置位+app地址数据不为空,则跳转地址(app开始地址) 

3. 无线升级

在以上两种升级方式上都是通过有线的方式对主控板进行固件升级,那么如何通过无线的方式进行升级呢,这里我不做详细介绍,有兴趣的朋友可以后台联系交流。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词