我们使用STM32芯片开发产品时,有时需要自带升级功能。因此,开发时除了需要准备基本的应用代码外,还得准备一套升级代码。通常称前者为IAP代码或BOOT代码,后者称之为APP代码。一般来讲,这两套代码基于两个工程完成并生成相应的执行文件,首次烧录时往往希望两套代码合并在一起进行烧录,这样方便、省事。
这里就该需求,利用ST提供的工具软件STLINKUtility来示范下合并过程。
因为只是模拟两个不同地址区的文件合并,所以这里的两个工程代码几乎一样,也很简单,只是存放的地址空间不同。
我使用的开发板是STM32L476RGNucleo板。代码功能都是接受按键,每收到1次按键动作,就打印出目前所在工作区。当收到3次按键后则从当前工作区跳往另一工作区。
两个工程的内存及中断矢量安排如下两幅图:
除了上面的配置差异外,两个工程的代码几乎一样,只是输出提示有别。
这里使用的是IAR IDE环境,基于上面两个工程分别生成IAP.HEX和APP.HEX两个执行文件。
然后打开STLINKUtility工具,连接开发板,将芯片擦除干净。接着,开始烧录,先烧IAP.hex文件。【其实先烧录谁无所谓】
之后,将当前IAP.HEX文件关闭,再调APP.hex文件进行烧录。注意这次烧录时选择跳过FLASH的擦除操作,因为刚开始已经全擦,而且前面已经写了IAP代码。
到此,两个工程的代码都写进芯片了。
现在,先在VIEW菜单里点击下Device Memory,然后在File菜单里选择文件另存操作。你选择HEX或BIN格式都可以。
使用BIN格式的话注意烧录时给出正确的起始地址。这个另存出来的文件就是合并过的文件了,可以直接拿来烧录。
下面是我基于合并文件烧录的测试结果。跟实际预期效果一样,每按键1次做1次输出,3次后跳转,这样往返操作。
操作很简单,也很方便。之前偶尔也会有人问起这个话题。这次整理本文做验证时,结果在做合并时总是失败。因为之前有验证过,坚信这个操作是可行的。后来怀疑可能是我电脑系统方面的原因,换成家里那台电脑测试起来就很顺畅,来回验证多次都正常。看来,我那台电脑该重装或换掉了。