IAP基础参考http://www.eeworld.com.cn/mcu/2018/ic-news112042038.html

https://blog.csdn.net/tq384998430/article/details/81010002

程序升级的文件:HEX、bin

HEX文件:特点:适合ISP,不适合FOTA(因为HEX开始有ISP升级的头字段);KEIL中的生成:Options -> Output 下勾选Create HEX File

BIN文件:真正升级的二进制文件字节流,尺寸小,适合FOTA;KEIL中生成方法:User选项卡下面的 After Build/Rebuild 设置并打钩:fromelf --bin !L -o .\BIN\FOTA.bin。

程序升级过程:

  • 在APP运行过程中,如果条件触发(案件按下、串口收到指定命令或者字符,从指定存储位置读取的版本号比当前新),此时APP会从指定的源头(/USB/SD/网页服务器)把APP_new.bin文件一次性或者分包拷贝到MCU的备份区(MCU的flash备份区、外部FLASH),置位需要更新程序的标志到非易失存储位置(RTC的BKP区、MCU的EEPROM/FLASH区、外部的eerom/flash区),然后让程序跳转到IAP程序中(复位跳转、直接跳转);
  • 在IAP程序中,若有升级标志则先擦除APP_RUN—FLASH,然后将备份区的内容拷贝到此运行区并做好校验,然后继续跳转会运行程序区(复位、直接跳转);若无升级标志或者过一定时间无操作则跳会APP运行程序区;
  • 运行APP程序(开始注意NVIC需要重定向NVIC_SetVectorTable(NVIC_VectTab_FLASH,APP_StartAddr),并继续监控是否需要升级。

简而言之:IAP要实现2个功能:跳转和更新程序

  1. 规划好boot程序和APP程序的起始地址;分别编写2个工程的程序,注意APP程序需要NVIC重定向NVIC_SetVectorTable(NVIC_VectTab_FLASH,APP_StartAddr)
  2. APP程序根据触发条件判断是否要升级,需要的话将新程序拷贝到一个存储位置,存储升级标记;并强制程序跳转到boot程序位置(也可以软重启)
  3. 进入BOOT程序后,如果有更新标记则擦除app的flash区域,并将新存储的程序写到app的flash区域,校验成功后取消更新标记,并强制跳转到APP区域。通过__asm("B APP_StartAddr +4")或者指针跳转void (*p)(void) = (void (*)(void))(*((int*)(APP_StartAddr +4))); p();实现跳转。
  4. 注意flash的操作先FLASH_Unlock,再FLASH_ClearFlag,操作完之后FLASH_Lock。
  5. 擦除可以用winhex删除制定区域,HEX转BIN的不一定能直接使用主机检查其开始地址是否是APP_StartAddr

FLASH的分区:

分2个区(IAP+APP)+外存(usb/sd/):此种没有老程序的备份,万一升级失败就只能冲刷老程序

分3个区(IAP+APP_Run+APP_BKP备份缓存):这种比较浪费MCU的flash,成本上没有利用外存经济。

分4个区IAP+APP_Run+APP_MAIN+APP_STATIC:其中APP_STATIC为参数存储区,

程序升级重点是要解决升级过程中升级失败(升级过程中关中断,若串口中断接收关其它中断)或者分包传输(没有大缓存)分包错误的处理;无线升级要考虑到客户的方便性、配合度、安全性、大批量升级的效率问题

BOOTloader分类:单独开发、UBOOT/MCU厂商或者中间件厂商rtt提供的BOOT

一 非无线接口:(串口、SPI/I2C/CAN/485/USB/SD):

1.0 :

1.x:程序的合并烧写:通过JLINK将IAP和app的烧写文件进行合并成一个烧写文件,大量MCU批量烧写可以利用这种方法。

二 无线接口(WLAN/WIFI/蓝牙/GPRS):

STM32的程序升级的更多相关文章

  1. STM32 IAP 在线升级详解(转)

    源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP   ...

  2. 如何使用串口来给STM32下载程序

    前言 第一次学习STM32的时候,不知道有调试器这个东西,所以一直是通过串口来给STM32下载程序,下载速度也还算可以,一般是几秒钟完成.后来用了调试器,可以直接在Keil环境下进行下载,而且还可以进 ...

  3. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

    实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...

  4. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级

    实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...

  5. STM32F103 串口-IAP程序升级

    STM32F103 串口-IAP程序升级 通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD.J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序 ...

  6. 【转载】STM32 IAP 在线升级详解

      (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...

  7. XE 的程序升级 XE5 问题处理记录

    XE 的程序升级 XE5 问题处理记录 1.  [dcc32 Fatal Error] frxClass.pas(3556): F1026 File not found: 'xxxxx\Registr ...

  8. DiscuzX程序升级教程_不知道关闭论坛的看过来

    DiscuzX程序升级教程,不知道关闭论坛的朋友看过来,适用于  1.0, 1.5 2.0 , 2.5Beta, 2.5RC,2.5, 3.0 1)关闭论坛:后台- 全局- 站点信息- 是否关闭 :是 ...

  9. IOS应用程序升级

    IOS应用程序升级流程介绍:IOS手机端应用程序需要升级时,打开服务器端html文件(本文为ucab.html文件)->点击在线安装->打开plist文件(本文中为ucab.plist文件 ...

随机推荐

  1. Unity引用System.Windows.Forms遇到的一些坑

    这两天在做一个unity打开文件选择框的功能.网上找到两种方法, 第一种是调用win32打开对话框,这个挺好,但是有个致命的问题,没办法多选!!!多选的话返回的是根目录的路径,文件名返回不了,找了半天 ...

  2. iframe重新加载

    方法1: document.getElementById('iframeId').contentWindow.location.reload(true); 方法2: document.getEleme ...

  3. 洛谷 P5016 龙虎斗(模拟)

    嗯... 题目链接:https://www.luogu.org/problem/P5016 这道题是一道模拟,不要考虑复杂,直接暴力枚举每一个点,看看加上s2之后两个势力的差值,找最小,记录下标. 注 ...

  4. Flask, Django - 区别,个人体会

    1. 目录结构 一般情况下,Django很系统.统一.Flask项目目录风格不同一,即使用上了蓝图. 2. 数据库迁移 Flask要用第三方extensions,而Django自带,这个很方便. 3. ...

  5. 记C++中发现的隐式转换问题

    #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; ...

  6. iOS-动态库创建(详解)

    https://blog.csdn.net/LisztCoder/article/details/78132147 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  7. Bugku-CTF加密篇之easy_crypto(0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 001101 00 10 1 0 010 0 000 1 01111 10 11110 101011 1111101)

    easy_crypto 0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 00110 ...

  8. 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架

    前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...

  9. 搭建一个maven管理的ssm项目需要配置那些文件

    链接:https://blog.csdn.net/java987654/article/details/80746866

  10. 吴裕雄--天生自然Numpy库学习笔记:NumPy 广播(Broadcast)

    广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足 a.shape == ...