【发布时间】: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 语言有关的任何事情使这项工作或不工作比这次对话更重要发生在英语中,并不意味着英语是解开这个谜团的钥匙,它只是到达终点的交通工具。
-
双启动是您拥有的操作系统和这些平台的通用/库存引导加载程序,这是您的平台您的引导加载程序,因此您可以定义启动方式,它是您的设计。
标签: microcontroller stm32 bootloader stm32f4 ansi-c