如何为STM32F4微控制器的闪存组实现OTA更新故障转移方案?

时间:2018-07-31 11:46:37

标签: microcontroller stm32 bootloader stm32f4 ansi-c

我正在为我的项目使用32位ARM STM32F439ZI微控制器。数据手册指出,该微控制器具有2 MB的闪存,分为2个1 MB的存储区,每个存储区可同时进行读写和擦除操作。

我想介绍微控制器的空中(OTA)固件更新。

我正在使用大约200-400 KB的闪存作为固件。

当然,我只能使用引导加载程序来刷新下载更新二进制文件。但是,我想通过使用两个1兆字节的闪存组作为故障保护功能来引入安全网。

例如:

  1. 应用程序将新的OTA固件包下载到外部存储中。
  2. 应用程序将带有内部闪存(模拟EEPROM)的标志设置为引导加载程序的信息,以从外部存储器加载OTA固件包。
  3. 引导加载程序检查哪个“分区”(闪存存储区A或B)处于活动状态,切换状态,并将OTA固件包闪存到刚刚激活的闪存存储区上。
  4. 引导加载程序会重置微控制器。
  5. 引导加载程序检测到存储体B是活动存储体,并将其内容作为固件加载。
  6. 发生看门狗事件或崩溃时,引导加载程序会检测到寄存器标志,并切换到包含先前固件版本的Flash Bank。

如果STM32F4可以进行“双重启动”,我找不到资源(关于STM32F7系列,有​​一些东西被宣传为专用的“功能”。)

STM32F4系列是否可能或推荐该过程?有没有更好的方法?引导加载程序分派调用(对活动闪存组的主要功能)的外观如何(Ansi C)?

2 个答案:

答案 0 :(得分:0)

我不确定,如果我完全理解“双启动”,但是如果要在闪存中包含两个版本的固件(当前将要替换的一个版本和新固件),那么最简单的方法是在启动OTA之前允许引导加载程序在闪存的单独区域中备份应用程序固件,但这会减少可用闪存的总量。我的硕士论文(Fail-proof over the air firmware upgrade for embedded systems)的主题非常相似。您可能想看看。

答案 1 :(得分:0)

  1. 具有故障转移功能的OTA由Mongoose OS https://mongoose-os.com用于STM32(包括STM32F4)实现。 Mongoose操作系统存储库位于https://github.com/cesanta/mongoose-os。引导加载程序存储库位于https://github.com/mongoose-os-apps/bootloader

  2. 对于没有内置连接的STM32设置,另一种方法是使用https://vcon.io。也就是说,一个ESP32 / ESP8266通信模块(以太网,WiFi,蜂窝)可以对任何连接的STM32微控制器进行OTA,并通过多种模式(例如透明UART桥)提供连接。

免责声明:我同时代表Mongoose OS和VCON产品。