c-在stm32cubeide中创建不同版本的.bin文件



上下文

我目前正在使用STM32CubeIDE为STM32F411CEU6开发固件,我将对几个UC进行编程,每个UC都将有一个ID(一个32位无符号数字),这个数字是静态的,在他的生命周期内永远不会改变,我们是一个小团队,但也许我们必须对几百个这样的设备进行编程,因此,手动更改代码中与ID相关的值会有点累,而且很耗时,所以,我的问题是:

?有没有一种方法可以编译不同版本的固件,从而生成几个.bin文件,每个文件都有唯一的区别,即这个单一的常量更改?

有没有办法使这个过程自动化?

我怎么想

我曾想过在头文件上定义这个常量(如果必须的话,还有其他常量),然后使用Python之类的东西来制作不同版本的代码,但之后我必须打开每个项目或工作区,并且仍然必须手动编译和生成每个.bin文件,有没有办法从Python(使用STM32CubeIDE)或类似的东西来生成.bin文件?

附加信息

  • 在STM32F411CEU6上工作
  • 使用STM32CubeIDE
  • 我有python C的基本知识++
  • 中等程度的C高级知识

提前感谢!如有任何帮助,将不胜感激

以下是一些想法。

  1. STM32F411芯片是用96位唯一设备ID预先编程的(STMicro在工厂)。也许您可以将设备的唯一ID用于自己的目的,而不是创建和分配自己的ID值。参见参考手册第24.1节。这似乎比试图为每个ID值创建和管理不同的bin文件要安全得多。

  2. 如果你真的想要自己的自定义ID值,那么将ID值与固件bin文件分开编程,这样你就不需要为每个单元创建/管理不同的bin文件。编写程序,使ID值位于ROM中已知的固定地址。使用链接器散点文件为ID值保留该地址。按两个步骤对每个单元的ROM进行编程,即bin文件和ID值。

  3. 如果您真的想将ID值合并到bin文件中,那么可以使用srec_cat.exe等工具来连接bin(也可以是十六进制或srec)文件。它非常通用,你应该学习手册页。如何使用该工具的一个例子是:在程序的源代码中,声明您的唯一ID值为一个常量指针,指向位于bin文件所消耗的ROM末尾之外的ROM中固定地址的常量值。像正常情况一样构建bin文件。然后运行srec_cat.exe将唯一ID值连接到具有适当偏移量的bin文件。您可以为每个唯一的ID值编写一个脚本来重复执行此操作。也许这个脚本是作为IDE的构建后操作运行的。这个解决方案可能会奏效,但确保正确的bin文件被编程到正确的设备上似乎是一场维护噩梦。

如果可以选择使用hex文件,则可以避免重新编译的需要,如下所示:

  1. 在程序外保留一些闪存空间(可以选择配置链接器脚本以确保该部分中没有数据)
  2. 使用python脚本生成intel十六进制数据,所需ID位于保留位置
  3. 只需将两个十六进制文件连接起来,然后像往常一样进行编程。我用STM32 ST-LINK实用程序/STM32CubeProgrammer对此进行了测试

要生成十六进制数据,可以使用intelhex包。例如:

import struct
from intelhex import IntelHex
from io import StringIO
ID_FLASH_ADDRESS = 0x8020000
hex_data = StringIO()
ih = IntelHex()
ih.puts(ID_FLASH_ADDRESS, struct.pack('<I', chip_id))
# Output data to variable
ih.write_hex_file(hex_data)
# Get the data
hex_data.getvalue().encode('utf-8')

注:

  • 有关'<I'的含义,请参阅结构文档
  • 我将数据输出到一个变量,但您也可以直接写入文件。请参阅intelhex文档

最新更新