STM32 link 最终二进制文件中固件的crc值

STM32 link crc value of firmware in the final binary

我正在尝试为自定义 STM32F401RE 板编写引导加载程序 + 应用程序,但我有一些问题。

目前,我的 booloader 位于 0x08000000,应用程序位于 0x08020000。这个想法是让引导加载程序在跳转到应用程序之前执行 CRC 检查。

我使用链接描述文件在 .isr_vector 之后和 .text 之前创建了一个名为 .fw_crc 的部分。在应用程序代码中,我可以直接写入flash中的这个地址。但这就是我卡住的地方。

如果我理解正确的话,我应该...

  1. 在应用程序中默认 CRC 值为 0。
  2. 构建二进制文件。
  3. 生成此二进制文件的 CRC。
  4. 使用一些十六进制工具用计算出的 CRC 值覆盖此部分。
  5. 再次重新生成二进制文件以进行最终刷写。

以上假设是否正确?使用更新的 CRC 值再次生成二进制文件不会最终更改最终二进制文件的结果 CRC 吗?

此外,在引导加载程序中,我是否从 application_address 开始到 application_address + binary_size 执行 CRC 检查?

Is the above assumption correct? Doesn't regenerating the binary a second time with the updated CRC value ultimately change the resulting CRC of the final binary?

  • CRC 的默认值可以设置为您喜欢的任何值。它将被您的 post-build 进程覆盖。

  • 在您的 post-build 步骤中,您必须计算除 .fw_crc 之外的整个应用程序二进制文件的 CRC,并将 CRC 结果写入该特定内存区域。但是,由于 .fw_crc 定义在 .isr_vector.text 区域之间,您应该考虑分别计算这两个部分的 CRC 并将它们合并。一个建议是 re-arrange 你的内存区域,使得 .fw_crc 位于开头。为此,您必须使用必要的偏移量重新定位闪存中的 ISR 向量 table。那么您将能够更轻松地计算应用程序二进制 CRC。

Also, inside the bootloader, do I perform the CRC check from the start of the application_address to application_address + binary_size?

如前所述,根据您当前的内存安排,您将需要计算两个内存区域的 CRC,即 .isr_vector.text。当然,您需要在bootloader内部进行相同的CRC计算和比较,以验证您的应用程序binray的有效性。

它把一件非常简单的事情复杂化了。在中断向量之后放置图像的长度(链接描述文件 - 简单地添加 FLASH 部分的长度)。

在post-build操作中计算CRC并将其附加到bin图像。当您刷新图像时,简单地对整个图像进行 CRC(包括末尾附加的 CRC)。结果应该是 0.