首页 > 解决方案 > STM32链接固件最终二进制的crc值

问题描述

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

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

我使用链接器脚本创建了一个名为.fw_crcright after.isr_vector和 before的部分.text。在应用程序代码中,我可以直接将其写入闪存中的此地址。但这就是我卡住的地方。

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

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

上述假设是否正确?使用更新的 CRC 值第二次重新生成二进制文件是否最终会改变最终二进制文件的结果 CRC?

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

标签: stm32bootloaderlinker-scripts

解决方案


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

  • CRC 的默认值可以设置为您喜欢的任何值。无论如何,它将被您的后期构建过程覆盖。

  • 在您的构建后步骤中,您必须计算除 之外的整个应用程序二进制文件.fw_crc的 CRC,并将 CRC 结果写入该特定内存区域。但是,由于在和区域.fw_crc之间定义了,因此您应该考虑分别计算这两个部分的 CRC 并将它们组合起来。一个建议是重新安排你的记忆区域,使其位于开始处。为此,您必须使用必要的偏移量重新定位闪存中的 ISR 向量表。然后您将能够更轻松地计算应用程序二进制 CRC。.isr_vector.text.fw_crc

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

如前所述,根据您当前的内存安排,您必须计算两个内存区域的 CRC,即.isr_vector.text. 当然,您需要在引导加载程序中执行相同的 CRC 计算和比较,以验证您的应用程序 binray 的有效性。


推荐阅读