STM32 link 最终二进制文件中固件的crc值
STM32 link crc value of firmware in the final binary
我正在尝试为自定义 STM32F401RE 板编写引导加载程序 + 应用程序,但我有一些问题。
目前,我的 booloader 位于 0x08000000,应用程序位于 0x08020000。这个想法是让引导加载程序在跳转到应用程序之前执行 CRC 检查。
我使用链接描述文件在 .isr_vector
之后和 .text
之前创建了一个名为 .fw_crc
的部分。在应用程序代码中,我可以直接写入flash中的这个地址。但这就是我卡住的地方。
如果我理解正确的话,我应该...
- 在应用程序中默认 CRC 值为 0。
- 构建二进制文件。
- 生成此二进制文件的 CRC。
- 使用一些十六进制工具用计算出的 CRC 值覆盖此部分。
- 再次重新生成二进制文件以进行最终刷写。
以上假设是否正确?使用更新的 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.
我正在尝试为自定义 STM32F401RE 板编写引导加载程序 + 应用程序,但我有一些问题。
目前,我的 booloader 位于 0x08000000,应用程序位于 0x08020000。这个想法是让引导加载程序在跳转到应用程序之前执行 CRC 检查。
我使用链接描述文件在 .isr_vector
之后和 .text
之前创建了一个名为 .fw_crc
的部分。在应用程序代码中,我可以直接写入flash中的这个地址。但这就是我卡住的地方。
如果我理解正确的话,我应该...
- 在应用程序中默认 CRC 值为 0。
- 构建二进制文件。
- 生成此二进制文件的 CRC。
- 使用一些十六进制工具用计算出的 CRC 值覆盖此部分。
- 再次重新生成二进制文件以进行最终刷写。
以上假设是否正确?使用更新的 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
toapplication_address + binary_size
?
如前所述,根据您当前的内存安排,您将需要计算两个内存区域的 CRC,即 .isr_vector
和 .text
。当然,您需要在bootloader内部进行相同的CRC计算和比较,以验证您的应用程序binray的有效性。
它把一件非常简单的事情复杂化了。在中断向量之后放置图像的长度(链接描述文件 - 简单地添加 FLASH 部分的长度)。
在post-build操作中计算CRC并将其附加到bin图像。当您刷新图像时,简单地对整个图像进行 CRC(包括末尾附加的 CRC)。结果应该是 0.