如何为 STM32F4 微控制器的 flash bank 实现 OTA 更新故障转移场景?

Posted

技术标签:

【中文标题】如何为 STM32F4 微控制器的 flash bank 实现 OTA 更新故障转移场景?【英文标题】:How to implement OTA update failover scenario for STM32F4 microcontroller's flash banks? 【发布时间】:2019-01-07 19:25:17 【问题描述】:

我正在为我的项目使用 32 位 ARM STM32F439ZI 微控制器。正如数据表所指出的,微控制器有 2 兆字节的闪存,分为 2 组,每组 1 兆字节,用于同时读取和写入/擦除。

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

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

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

例如:

    应用程序将新的 OTA 固件包下载到外部存储中。 应用程序使用内部闪存(模拟 EEPROM)设置一个标志,作为引导加载程序从外部存储加载 OTA 固件包的信息。 引导加载程序检查哪个“分区”(闪存库 A 或 B)处于活动状态,切换状态并将 OTA 固件包刷入刚刚激活的闪存库。 引导加载程序重置微控制器。 引导加载程序检测到 bank B 是活动 bank,并将其内容作为固件加载。 当出现看门狗事件或崩溃时,引导加载程序会检测到寄存器标志并切换到包含先前固件版本的闪存库。

如果 STM32F4 可以实现“双启动”,我找不到资源(STM32F7 系列有一些东西,但宣传为专用“功能”)。

STM32F4 系列是否可以或推荐使用该工艺?有更好的方法吗?以及引导加载程序调度调用(对活动闪存库的主要功能)的外观如何(Ansi C)?

【问题讨论】:

是可行的,大部分情况下都在正确的轨道上,基本上你想要拥有冗余功能。 ANSI-C 与它无关,不是 C 语言的东西,并不意味着你不会使用 C,只是意味着 C 不相关。 事实上,C 具有相关性,因为我用 C 编写引导加载程序,用 C 编写应用程序,并且作为引导加载程序,我用 C 编写,我必须告诉机器闪存库 A或 B 必须加载 - 在 C 中。最后一部分是我不知道的地方。 这听起来根本不是双冗余,而是一种允许更新的方式。但是您需要考虑失败的更新,错误的图像。为了让它发挥作用,您需要一定比例的好代码永远不会变坏。 了解您正在使用 C,但 C 与此任务无关,没有 C 魔术调用或与 C 语言有关的任何事情使这项工作或不工作比这次对话更重要发生在英语中,并不意味着英语是解开这个谜团的钥匙,它只是到达终点的交通工具。 双启动是您拥有的操作系​​统和这些平台的通用/库存引导加载程序,这是您的平台您的引导加载程序,因此您可以定义启动方式,它是您的设计。 【参考方案1】:

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

【讨论】:

【参考方案2】:

    带故障转移的 OTA 由 Mongoose OS 实现,https://mongoose-os.com 用于 STM32(包括 STM32F4)。 Mongoose OS 存储库位于 https://github.com/cesanta/mongoose-os。引导加载程序仓库位于 https://github.com/mongoose-os-apps/bootloader

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

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

【讨论】:

以上是关于如何为 STM32F4 微控制器的 flash bank 实现 OTA 更新故障转移场景?的主要内容,如果未能解决你的问题,请参考以下文章

stm32 f103和f407的区别?

我应该从哪里获得 STM32 微控制器的头文件?

如何设置快速 STM32 F4 FSMC 来控制 STM32F4Discovery 板上的显示?

如何使用 JTAG 链接调试两个或多个微控制器?

使用STM32F4采集数据的新方法

STM32F4 FLASH笔记