STM32 IAP在线刷写 BOOTLOADER 防止程序刷错单片机的方法

比如我们有两个电路板,一个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文件中,最靠前的位置受以下因素限制:

  1. 中断向量表:必须占据最开始的地址(STM32F4为0x08000000开始,通常占128-256字节)

  2. 编译器生成的启动代码:紧随向量表之后

  3. 链接器自动布局:会优先放置这些系统必需内容

实际可达到的最靠前位置

绝对最小偏移量(BIN文件)

  • 向量表之后:通常可以放在 0x08000200(偏移量0x200)处

  • 某些情况下:可压缩到 0x08000100(偏移量0x100)

  • 对于STM32F4系列:

    地址偏移量安全等级说明
    0x080000000x0❌危险覆盖向量表第一个条目
    0x080000040x4❌危险覆盖初始SP值
    0x080001000x100⚠️需验证可能接近启动代码末尾
    0x080002000x200✅安全通用推荐位置
    0x080004000x400✅安全更保守的安全位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值