一代睡神的崛起 发表于 2018-11-2 08:24:23

第二期:进来聊聊在应用编程(IAP)升级固件程序设计流程吧

本帖最后由 一代睡神的崛起 于 2018-11-2 12:52 编辑

随着电子产品日新月异的更迭换代,原代产品出货后发现其中有细微的bug在测试的时候没有注意到,于是在修复过程中需要通过bootload烧写Flash进行固件升级从而更新产品。很多人在IAP升级过程中只是一味盲目的拿着demo在一通copy和paste没有过多的在乎原理,即使成功了其中的原理也没有吃透。因此遂向大家征集,希望大佬们慷慨讲述。
到中午了,给大家画一下流程图吧。如下图,进行IAP升级得准备两个程序,一个Flash程序,一个用户APP程序。第一个项目程序不执行正常的功能操作,而只是通过某种通信方式接收程序或数据,执行对第二部分代码的更新;第二个代码才是真正的功能代码。上电后执行操作为:①检查是否对第二部分代码进行更新②如果不需要更新进行程序跳转正常执行③如果需要更新则进入APP程序。值得注意的是,第一个Flash程序需要通过直接烧录到MCU当中去,这个东西用过的人都知道。而第二个程序笔者公司的产品升级是通过生成DFU文件然后移交给手机APP修改bootload进行在线升级固件。至于如何生成DFU文件,这里我就不多讲了,大家百度去。最后附上DFU源码包。至于怎么跳转,用户可以设置条件,建议耗时短,APP程序里面也有官方也有,这里不多说了。最重要的是一定要明白Flash地址意义。


maxtch 发表于 2018-11-2 13:11:50

我提到的用 ESP8266 无线模块更新 STM32 的方案有几个好处:
[*]不需要 STM32 程序携带 IAP 而是依赖掩膜 ROM 中的 ISP,只要 ESP8266 无恙便不会刷成砖;
[*]ESP8266 自带 Wi-Fi,很容易可以实现云端推送更新,只要产品硬件没有问题就不存在召回;
[*]ESP8266 必须外挂 Flash,但可以外挂大容量 Flash(例如 16MB,常见的 ESP8266 模块一般带 2MB 或 4MB 闪存)以满足 STM32 固件本地暂存的需要。
[*]在日常使用中,ESP8266 可以当作 STM32 的无线和加密协处理器。

dsjsjf 发表于 2018-11-3 13:36:47

IAP,一般需要把MCU内的Flash分为两个区,一个为Bootloader,一个为APP。
我常用的有两种思路,两种各有优缺点。
第一种:在APP运行程序中接收到固件升级指令,跳转到Bootloader中,在Bootloader中接收待更新的固件数据,并且校验其正确性,把数据写到APP区,全部接收完成后,跳转到APP运行。这个方法的好处是,不需要额外的Flash区域,缺点是升级的端口协议相对固定、不自由。
第二种:在APP中接收待更新的固件数据,并且检验其正确性,再把数据写到备份区,完成后,跳转到Bootloader,在Bootloader中对备份区检查,如果有新数据,则把它搬到APP区,最后跳转到APP运行。这个方法的好处是,在APP中接收数据,APP里可以自由更换升级端口,比如串口,CAN,以太网等,应用中使用的什么端口,升级就可使用什么端口,Bootloader中只负责从备份区往APP区搬运数据。缺点就是需要使用和APP空间同样大小的备份区。

stm1024 发表于 2018-11-2 09:02:25

本帖最后由 stm1024 于 2018-11-2 19:49 编辑

AN2606,以及:
– AN3154: CAN protocol used in the STM32 bootloader
– AN3155: USART protocol used in the STM32 bootloader
– AN3156: USB DFU protocol used in the STM32 bootloader
– AN4221: I2C protocol used in the STM32 bootloader
– AN4286: SPI protocol used in the STM32 bootloader有你关心的所有信息。
根本的原理很简单:自举程序和用户代码肯定分别存放在程序的某个区域,其实自举程序都在芯片出厂的时候烧录好了,你所需要的就是做两件事:
1. 进入自举程序
2.按自举程序的命令格式发送数据

升级固件,说白了,就是写数据到flash中去,只是这种这数据的操作,和一般的写数据有那点不太一样而已。

Johnson Cao 发表于 2018-11-2 09:12:54

在有通信接口的情况下,一般BOOT中实现XModem,基于UART或CAN,BOOT还需要检查看门狗重启状况,如果连续5次看门狗重启,说明程序是坏的,就不要跳转了.直接进入XModem升级模式.如果有人机界面,一般是通过U盘升级,这样需要有一个备份区,先升级到备份区,再通过BOOT重启的时候搬到应用区.

tanic 发表于 2018-11-2 10:28:23

应当多考虑的时升级失败的处理,升级成功没啥说的

watershade 发表于 2018-11-2 11:00:08

IAP的原理很多书籍介绍的很多。简单的理解,就是通过各种接口从外部读取准备烧录的内容,存储到指定位置。(或者暂存到暂存区域)然后check之后,让程序重新从这个区域执行。集体涉及的问题又很多,怎么把达普良数据存进来,怎么check,怎么跳转。有更专业的书籍和文章,可以看看
官方的代码是最好的教程

maxtch 发表于 2018-11-2 12:22:56

我所做支持 IAP 的板子基本都有 ESP8266 无线模块用以支持云端推送更新,而且 ESP8266 软件里面包含 STM32 内置 ROM 串口 ISP 的驱动。如果发现云端有更新,STM32 指挥 ESP8266 把更新包下载到 ESP8266 自己的闪存里,数字签名验证无误后 ESP8266 会把 STM32 复位并调用 ISP 把下载的更新包刷入 STM32。

一代睡神的崛起 发表于 2018-11-2 12:24:26

看来大家对这篇帖子的兴趣度不高啊。下面我来讲解下,勾画一下流程图吧

wudianjun2001 发表于 2018-11-2 13:33:01

我自己VB弄个小软件,用户程序部分生成的BIN进行加密处理,加密后在IAP进行更新程序(MCU收到后进行解密处理,然后再写FLASH),这样加密后的BIN可以直接给用户,让用户自己去更新了。搞的再复杂点的话,可以根据唯一ID进行加密,这样就是每个MCU的更新BIN都不一样了。

springvirus 发表于 2018-11-2 15:14:11

我接触到的ARM7的IAP,是把先接收来自上位机的bin文件内容,然后复制写Flash的函数到一块足够大的RAM中,然后运行该函数
页: [1] 2
查看完整版本: 第二期:进来聊聊在应用编程(IAP)升级固件程序设计流程吧