bootloader固件升级开发原理
固件升级
- 前言
- 一、什么是固件升级
- 二、固件升级流程
- 三、固件开发流程
- 1. UART升级
- (1)bootloader开发
- (2)app开发
- 2. CAN升级
- (1)CAN盒
- (2)主控板
- 3. 无线升级
前言
在实际企业中,对产品进行软件上的更新迭代,不再会像你在学校里头用st-link或者j-link等烧录器对单片机进行直接擦写,而是会将一个产品编写两套代码(Bootloader和APP),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. 无线升级
在以上两种升级方式上都是通过有线的方式对主控板进行固件升级,那么如何通过无线的方式进行升级呢,这里我不做详细介绍,有兴趣的朋友可以后台联系交流。