0

对于我刚开始工作的项目,我需要用 C 语言编写一个固件,让我可以启动到两个不同的固件版本。任务是能够使用带有 Intel .hex 文件的 RS485 端口在现场更新包含 STM 的设备。我的想法是将两个固件版本放在闪存中指定的起始地址,包括某种校验和以确保数据完整性。根据参考手册中的闪存模块组织,我的第一个想法是将一个版本放入扇区 10(从 0x080C0000 开始),将另一个版本放入扇区 11(从 0x080E0000 开始)。每次复位后,STM32 应该启动到“bootmanager”,这只是决定扇区 10 或扇区 11 中的固件是较新版本的最少代码。我想在下图中阐明我的想法:

每个扇区的 128kBytes 就足够了。到目前为止,我能够将单字节写入闪存并在之后读取它们。另外,我已经使用 RS485 建立了一个工作的 UART 通信。

我的问题

  1. 我可以直接将 .hex 文件写入 Flash 中,无需修改,例如
:020000040800F2 
:1000000002200B

ETC?

  1. 由于我对跳转不熟悉:我应该如何执行从“bootmanager”到扇区 5 固件的跳转?地址是否自动相对于扇区 5 的入口点?

  2. 你能给我关键词或告诉我,我会遇到什么挑战吗?

*编辑:我知道 STM 本身包含一个引导加载程序。不幸的是,RS485 设备硬连线到 USART2 使用的 GPIO 引脚。根据参考手册,内部bootloader只能被USART1和USART3、CAN2和USB OTG FS使用

4

2 回答 2

1

我可以直接将 .hex 文件写入 Flash 中,无需修改,例如

不,你不能。您需要修改链接描述文件以将其归档

您需要将整个两个应用程序都放在 FLASH 中,因此将其划分为 50/50%。

如果两个图像都损坏了,我通常会添加一些串行闪存来获得固件副本。

你需要编写自定义引导加载程序。

于 2020-07-14T09:43:36.250 回答
0

大多数 STM32 微控制器都支持双存储库和动态更新(参见AN4767 - 双存储库 STM32 微控制器的动态固件更新

这将允许完全执行您需要的操作。

通常,微控制器需要一个引导加载程序和 2 个用于映像的库。启动时,引导加载程序将启动并检查它必须启动的版本并相应地设置起始地址。

本应用笔记适用于 F7 系列,但您可以查看它以了解它如何适用于您的特定微控制器(参见AN4826 - STM32F7 系列闪存双存储区模式)。

关于你的问题:

  • 代码将照常编写,但两次(或 2 个不同的固件)
  • 查看引用的应用说明和关键字,例如:双库、即时更新、DFU 等
于 2020-07-14T08:07:52.580 回答