【发布时间】: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 之前将它包含到启动代码中。我会尝试将此函数放在闪存中的专用地址,这样它就不会包含在实际固件中。
-
会的。您的引导加载程序将执行此操作(接收数据并写入闪存)
标签: c stm32 bootloader stm32cubeide