STM32 F407VG 启动到不同的(主)应用程序

Posted

技术标签:

【中文标题】STM32 F407VG 启动到不同的(主)应用程序【英文标题】:STM32 F407VG Boot into different (main-)applications 【发布时间】:2020-11-03 12:13:06 【问题描述】:

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

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

我的问题

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

等等?

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

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

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

【问题讨论】:

最好的解决方案是让 PIC 代码直接在闪存位置运行,但没有编译器可以保证完整的 PIC 代码。另一种解决方案可能是为 2 个存储库地址链接 2 个映像,下载一个适合闪存位置的映像(相同的映像构建,不同的链接器描述符)。最终,引导加载程序可以在 RAM 中移动向量表并修复一些地址。转向双组 MCU 的最佳选择... @Frankie_C 你知道如何将带有 int 向量的程序放在 FLASH 中的另一个位置吗?您想如何创建 PIC 代码 - 请详细说明。 @Frankie_C 不能选择转移到另一个 MCU,因为硬件不会改变。 所以,现在我的想法是在一个名为“preMain”的单独 c 文件中定义一个函数。我将在调用 main 之前将它包含到启动代码中。我会尝试将此函数放在闪存中的专用地址,这样它就不会包含在实际固件中。 会的。您的引导加载程序将执行此操作(接收数据并写入闪存) 【参考方案1】:

大多数 STM32 微控制器都支持双存储库和动态更新(cf AN4767 - On-the-fly firmware update for dual bank STM32 microcontrollers)

这将允许您完全按照您的要求执行。

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

此应用说明适用于 F7 系列,但您可以查看它以了解它如何适用于您的特定微控制器(参见 AN4826 - STM32F7 Series Flash memory dual bank mode)。

关于您的问题:

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

【讨论】:

您好 GSalazar,感谢您的回复。我也遇到过双内存条,但 F407 不支持此功能。 在这种情况下,您很可能必须实现自定义引导加载程序(它只是在微控制器中运行的特殊固件)并检查从正在运行的应用程序写入闪存的机制。 STM32最有可能有方法重启进入bootloader或者跳转到特定地址【参考方案2】:

我可以直接将 .hex 文件直接写入 Flash 中吗? 修改之类的

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

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

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

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

【讨论】:

您好 P__J__,感谢您的回复。我不知道通过修改链接描述文件来归档 -hex 文件是什么意思。 “您需要将整个两个应用程序都放在 FLASH 中,因此将其划分为 50/50%” - 您是否建议将整个闪存划分为 50/50?因为我不需要那么多空间,所以我的想法是为每个固件版本使用一个扇区,就像我在原帖中提到的那样。 我修改了我的链接器脚本并添加了两个长度为 256k 的内存段 FW1 和 FW2。我将启动代码存储在启动部分的开头,而主(固件版本)存储在内存部分 FW1 中。所以我想现在我必须重写启动代码? 可能不会,但您需要在调用应用程序之前编写引导加载程序来设置向量表等。

以上是关于STM32 F407VG 启动到不同的(主)应用程序的主要内容,如果未能解决你的问题,请参考以下文章

STM32F407VG 时钟配置

STM32F407VG 定时器

stm32F407VG JTAG引脚怎么样设为普通IO

STM32F407开发板用户手册第13章 STM32F407启动过程详解

STM32F407的Modbus做为主站与从站通讯

stm32f407启动文件分析