你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
一代睡神的崛起 提问时间:2018-11-2 08:24 /
本帖最后由 一代睡神的崛起 于 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地址意义。


FLASH

FLASH

加入APP

加入APP

Project-DFU.rar

下载

10.76 MB, 下载次数: 49, 下载积分: ST金币 -1

DFU

收藏 6 评论24 发布时间:2018-11-2 08:24

举报

24个回答
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 的无线和加密协处理器。

点评

FOTA  发表于 2018-11-2 19:47
我们公司现在主要的还是通过手机连接设备蓝牙进行信息固件更新的,有时候还不太稳定,听老哥这个方案感觉很稳啊,我打个样板区借鉴一波  发表于 2018-11-2 13:31
埃斯提爱慕 最优答案 回答时间:2018-11-3 13:36:47
提示: 作者被禁止或删除 内容自动屏蔽
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中去,只是这种这数据的操作,和一般的写数据有那点不太一样而已。

点评

咱们要让更多的人掌握原理哟  发表于 2018-11-2 09:04
Johnson Cao 回答时间:2018-11-2 09:12:54
在有通信接口的情况下,一般BOOT中实现XModem,基于UART或CAN,BOOT还需要检查看门狗重启状况,如果连续5次看门狗重启,说明程序是坏的,就不要跳转了.直接进入XModem升级模式.如果有人机界面,一般是通过U盘升级,这样需要有一个备份区,先升级到备份区,再通过BOOT重启的时候搬到应用区.

点评

这也是一个办法,现在市场上很流行的是通过手机APP发送指令然后bootload升级固件版本  发表于 2018-11-2 09:52
tanic 回答时间:2018-11-2 10:28:23
应当多考虑的时升级失败的处理,升级成功没啥说的

点评

有些升级成功只是拿着自己都不知道的demo在覆盖,原理性东西好多人都不了解的  发表于 2018-11-2 10:42
watershade 回答时间:2018-11-2 11:00:08
IAP的原理很多书籍介绍的很多。简单的理解,就是通过各种接口从外部读取准备烧录的内容,存储到指定位置。(或者暂存到暂存区域)然后check之后,让程序重新从这个区域执行。集体涉及的问题又很多,怎么把达普良数据存进来,怎么check,怎么跳转。有更专业的书籍和文章,可以看看
官方的代码是最好的教程

点评

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

点评

很不错的方案,谢谢分享  发表于 2018-11-2 12:57
一代睡神的崛起 回答时间:2018-11-2 12:24:26
看来大家对这篇帖子的兴趣度不高啊。下面我来讲解下,勾画一下流程图吧
wudianjun2001 回答时间:2018-11-2 13:33:01
我自己VB弄个小软件,用户程序部分生成的BIN进行加密处理,加密后在IAP进行更新程序(MCU收到后进行解密处理,然后再写FLASH),这样加密后的BIN可以直接给用户,让用户自己去更新了。搞的再复杂点的话,可以根据唯一ID进行加密,这样就是每个MCU的更新BIN都不一样了。

点评

哇,升级搞这么复杂,很多人接受不了的。其实升级最简单来说就是把固件给替换了  发表于 2018-11-2 13:51
springvirus 回答时间:2018-11-2 15:14:11
我接触到的ARM7的IAP,是把先接收来自上位机的bin文件内容,然后复制写Flash的函数到一块足够大的RAM中,然后运行该函数

点评

这个方法,有他的实用性。  发表于 2018-11-2 15:18
jiaxiaokui 回答时间:2018-11-2 15:56:29
为了理解OTA固件升级,可将存储器分为引导加载区和应用程序区。与UART 引导加载程序相比,此处最大的不同是用于从主机接收新固件的接口。OTA固件升级使用一个无线通信接口接收更新后的固件映像。取决于具体应用,逐个接口可能是WiFi、ZigBee、蓝牙或任何其它无线接口。无论何种接口,其过程和基本原理都是相同的。

点评

这个表示还没去尝试过诶,谢谢分享,有机会去试着玩一下  发表于 2018-11-2 16:05
奇迹 回答时间:2018-11-2 18:32:48
提示: 作者被禁止或删除 内容自动屏蔽
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版