当前位置: 首页 > news >正文

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. 无线升级

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 设计模式-结构型-11-代理模式
  • 大数据新视界 --大数据大厂之Kubernetes与大数据:容器化部署的最佳实践
  • 【数据结构】线性数据结构-顺序栈
  • ChromaDB教程_2024最新版(上)
  • 《华为交换机堆叠配置》
  • Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行
  • 软考高级:逻辑地址和物理地址转换 AI解读
  • LeetCode[中等] 155. 最小栈
  • React组件如何暴露自身的方法
  • Python | Leetcode Python题解之第415题字符串相加
  • Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对
  • Ubuntu LLaMA-Factory实战
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信
  • 机器学习_神经网络_深度学习
  • [OpenGL]使用OpenGL绘制带纹理三角形
  • 03Go 类型总结
  • avalon2.2的VM生成过程
  • CentOS7 安装JDK
  • CSS3 变换
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux后台研发超实用命令总结
  • Lucene解析 - 基本概念
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Transformer-XL: Unleashing the Potential of Attention Models
  • unity如何实现一个固定宽度的orthagraphic相机
  • vuex 学习笔记 01
  • 百度地图API标注+时间轴组件
  • 半理解系列--Promise的进化史
  • 回顾 Swift 多平台移植进度 #2
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 区块链技术特点之去中心化特性
  • 入手阿里云新服务器的部署NODE
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 移动端 h5开发相关内容总结(三)
  • 与 ConTeXt MkIV 官方文档的接驳
  • 正则表达式
  • 2017年360最后一道编程题
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • #etcd#安装时出错
  • (k8s)Kubernetes本地存储接入
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Net Memory Profiler的使用举例
  • .Net Web项目创建比较不错的参考文章
  • .Net 高效开发之不可错过的实用工具
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net反编译的九款神器