比如我们有两个电路板,一个F407,一个F767,如果两个板子同时编程测试时,很容易把767的程序错刷到407上。。因此考虑增加一道MCU的验证,当然也可以是同单片机,但不同电路板时防止刷错的验证。
思路:
在APP的生成的HEX或BIN文件的固定位置保留一个识别码,例如强制在0x8080200处设置10,而在BOOT程序中也要设置这个编码,当然不需要在hex或bin之类的位置,而是要IAP软件与BOOT要增加交互,即每次刷写时,首先IAP软件要询问BOOT程序当前的识别码是什么(可以直接定义一个串口指令,比如IAP软件下发AA BB CC,BOOT硬性回复AA BB CC 0B)。然后把这个识别码与从HEX/BIN中固定位置查到的识别码对比,一致时才进行下一步刷写操作。
实现:
想让HEX/BIN在固定位置设置一个数据很简单一行代码(任意C文件开始部分均可):
const uint8_t board_id __attribute__((at(0x08080200))) = 11; // 识别码为11.
编译并打开HEX文件确认(搜索10020000):
:100200000B0000002C4B19680868B0E8F04F80F331
可以看到跟设置的一致。这样IAP软件就很容易查到这个识别码了。
当然这个地址0x08080200也很讲究,不是随意的。这里感谢DEEPSEEK。一般最前不要超过0x08080200。当然中间的8是因为我这里是用了APP的地址偏移,
DEEPSEEK:
在STM32的HEX/BIN文件中,最靠前的位置受以下因素限制:
中断向量表:必须占据最开始的地址(STM32F4为0x08000000开始,通常占128-256字节)
编译器生成的启动代码:紧随向量表之后
链接器自动布局:会优先放置这些系统必需内容
实际可达到的最靠前位置
绝对最小偏移量(BIN文件)
向量表之后:通常可以放在 0x08000200(偏移量0x200)处
某些情况下:可压缩到 0x08000100(偏移量0x100)
对于STM32F4系列:
地址 偏移量 安全等级 说明 0x08000000 0x0 ❌危险 覆盖向量表第一个条目 0x08000004 0x4 ❌危险 覆盖初始SP值 0x08000100 0x100 ⚠️需验证 可能接近启动代码末尾 0x08000200 0x200 ✅安全 通用推荐位置 0x08000400 0x400 ✅安全 更保守的安全位置