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

IAP 程序升级原理解析

参考见:IAP升级 资料收集-CSDN博客

一、IAP是什么?

        IAP(In Application Programming,在应用编程)是一种技术,它允许在设备运行过程中通过软件对固件进行更新。这种更新方式不需要使用特殊的硬件编程器或者移除芯片,因此也被称为在线编程或空中下载技术(OTA, Over-The-Air)。IAP升级对于物联网设备、嵌入式系统等非常重要,因为它允许在产品部署后进行功能更新或修复错误。      

二、为什么使用IAP? 

        如果芯片内没有程序的话,无法直接进行烧录。因此,在使用J-Link或其他编程器进行烧录代码时,通常情况下芯片中至少有一部分程序作为引导加载程序(Bootloader)。不过,需要注意的是,不是所有的芯片出厂时都带有内置的Bootloader。对于某些芯片,如STM32系列,它们可能包含了一个简单的Bootloader,但更多的是需要用户自己编写一个Bootloader来实现特定的固件升级功能。

        当我们购置一块STM32芯片时,它可能不自带Bootloader。在实际的工业生产中,为了实现远程固件升级,我们需要自行编写一个Bootloader来升级应用程序代码(App Code)。Bootloader的主要任务是接收和验证固件更新数据,并将其写入到闪存中适当的位置。

        Bootloader是一个小型程序,负责管理固件的更新过程。它通常包括检测更新、接收更新数据、验证数据完整性以及将新固件写入闪存等任务。App Code (User Application)是设备的主要功能实现部分,即用户编写的用于实现特定功能的代码。

         

        在闪存flash的分区上,一般建议将闪存的前64KB用来存放Bootloader程序,这部分空间不会被应用程序覆盖,以确保Bootloader始终可用。剩余的空间则用于存放应用程序代码(App Code)和其他数据。

如下面的flashboot.jlink文件设置:

USB 
si SWD
speed 4000
device R7FA6M4AD
r
erase 0x00 0xffff    # 0xffff = 65535
loadfile Boot_V1.bin 0x0
r
go
quit

在实际应用中,Bootloader可能需要实现以下功能:

  • 通过某种通信接口(如串口、USB、网络等)接收固件更新数据。
  • 验证接收到的数据(如使用CRC校验、数字签名等)。
  • 将验证过的固件数据写入到闪存的适当位置。
  • 更新完成后,重启系统并跳转到新的应用程序代码开始执行。

二、IAP升级的工作原理

IAP升级的基本思想是在设备中预先安装一个小型的程序,称为Bootloader。这个Bootloader负责管理固件的更新过程。典型的IAP升级过程包括以下几个步骤:

  1. 分区管理:

    • 通常,固件所在的闪存(Flash Memory)会被划分为多个区域。其中一个区域用于存储Bootloader,其他区域则用于存储应用程序代码(App Code)和其他数据。
  2. Bootloader的功能:

    • 检测更新: Bootloader检查是否有可用的更新文件。
    • 数据接收: 通过某种通信接口(如串口、USB、以太网等)接收更新文件。
    • 验证: 对接收到的数据进行验证,确保数据完整无误。
    • 更新: 将新的固件写入到指定的闪存区域。
    • 跳转: 更新完成后,Bootloader会跳转到新的固件地址执行更新后的代码。
  3. 应用程序代码:

    • 应用程序代码是设备的主要功能实现部分。
    • 当Bootloader完成更新后,它会跳转到应用程序代码继续执行。
  4. 异常向量表重定位:

    • 由于应用程序的起始地址可能会改变,因此在跳转到新的应用程序之前,可能需要重新定位异常向量表以确保中断和异常能够被正确处理。

三、实现IAP升级的关键技术

  • 通信协议: 选择合适的通信协议(如SPI、I2C、UART、TCP/IP等)来传输更新数据。
  • 安全措施: 保证数据传输的安全性,例如使用CRC校验、数字签名等技术来验证数据的完整性和真实性。
  • 闪存管理: 包括扇区擦除、数据写入等操作。

四、示例

以STM32单片机为例,实现IAP升级通常涉及以下步骤:

  1. Bootloader开发:

    • 编写用于接收和验证更新数据的代码。
    • 实现闪存管理和异常向量表重定位等功能。
  2. 应用程序开发:

    • 开发主应用程序代码。
  3. 通信接口配置:

    • 设置用于数据传输的通信接口。
  4. 固件更新流程:

    • 设计固件更新的整体流程,包括检测更新、接收数据、验证和更新。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [网鼎杯2018]Unfinish解题,五分钟带你解题
  • 分享 | 某外资保险集团进一步提升数字身份管理水平 有助于中国业务的高速发展
  • 如何把uniapp 项目发布成Andriod App的流程
  • 【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现
  • arthas的tt命令
  • ESP32在ESP-IDF环境下禁用看门狗
  • 【STL】 vector的底层实现
  • MongoDB基础【学习笔记】
  • Linux文件或图片名称中文乱码解决【适用于centos、ubuntu等系统】
  • MATLAB中“varargin”的作用
  • TCL 实业 x TiDB丨从分销转向零售,如何考虑中台建设和数据库选型?
  • 《Techporters架构搭建》-Day04 基础架构
  • C基础项目(学生成绩管理系统)
  • 从根儿上学习spring 七 之run方法启动第四段(1)
  • 云计算实训21——mysql-8.0.33-linux-glibc安装及使用
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • exif信息对照
  • iOS 颜色设置看我就够了
  • java2019面试题北京
  • Java超时控制的实现
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • use Google search engine
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 成为一名优秀的Developer的书单
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 记一次和乔布斯合作最难忘的经历
  • 学习JavaScript数据结构与算法 — 树
  • 因为阿里,他们成了“杭漂”
  • 源码安装memcached和php memcache扩展
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 说说我为什么看好Spring Cloud Alibaba
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (8)STL算法之替换
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (九)信息融合方式简介
  • (南京观海微电子)——COF介绍
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (推荐)叮当——中文语音对话机器人
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)一些感悟
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • . NET自动找可写目录
  • .a文件和.so文件
  • .NET Project Open Day(2011.11.13)
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET中GET与SET的用法
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • ?php echo ?,?php echo Hello world!;?
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)