CC2640 OAD 生产烧录单文件实现

1 前言

在使用 CC2640 OAD功能时,每次烧录都要烧录四个文件,而且四个工程四个输出文件都在不同的文件夹,操作起来复杂的很,所以折腾了一下,将四个烧录件合并为单个 .bin 文件,直接烧录一个即可。

2 开发环境

  • 系统: win11
  • IAR Embedded Workbench IDE - Arm 8.32.1
  • SDK版本: simplelink_cc2640r2_sdk_5_30_00_03
  • 例程: blestack\simple_peripheral_oad_onchip
  • JFlash

3 实现

oad_onchip 项目中,有四个工程,分别是 bim_onchipapppersistent_appstack,这些工程代表的意义这里就不赘述了,对这篇文章感兴趣的,相信应该对这些已经有一定的了解。

这四个工程对应的文件夹如图所示,

00.png

01.png

对整个项目进行编译后,会依次在下述几个路径生成对应的编译文件:

1
2
3
4
.\simple_peripheral_oad_onchip\tirtos\iar\app\FlashROM\Exe
.\simple_peripheral_oad_onchip\tirtos\iar\bim_onchip\FlashOnly\Exe
.\simple_peripheral_oad_onchip\tirtos\iar\persistent_app\FlashOnly\Exe
.\simple_peripheral_oad_onchip\tirtos\iar\stack\FlashROM\Exe

生成的编译文件包括了 .out.hex.bin 等,因为是烧录文件,并不需要附带调试信息和地址信息,那么 .bin 文件就是我们需要的目标,那么每次烧录四个 .bin 文件,就需要到这四个路径下找到该文件,属实有点繁琐,那么第一步,我们就先把需要的文件归并到一个目录去。

3.1 bim_onchip

02.png

进入 IAR,因为这边我是用的 IAR 编译的,右键 cc2640r2lp_bim_onchip 工程,选择 options.. 进入选项中,找到 Build Actions,我们需要修改其中的 Post-build command line:,这个是相当于编译完后要执行的命令,cc2640r2lp_bim_onchip 默认应该是空的,也就是没有我框起来的内容,那么我们给它添加一组命令,内容如下:

1
cmd /C "$EXAMPLE_BLE_ROOT$\tools\hex2bin.exe $EXE_DIR$\$TARGET_BNAME$.hex $PROJ_DIR$\..\output\$TARGET_BNAME$.bin

上述命令的内容,我简单描述下,

$EXAMPLE_BLE_ROOT$,这个代表的是 example 工程的路径,也就是我们当前选择的例程的路径 .\simple_peripheral_oad_onchip\,所以就是说使用例程路径下的 tools 文件夹的 hex2bin.exe 将编译生成的 sp_oad_onchip_cc2640r2lp_bim_onchip_FlashOnly.hex 转换为 sp_oad_onchip_cc2640r2lp_bim_onchip_FlashOnly.bin 并放在 $PROJ_DIR$\..\output 文件夹中,$PROJ_DIR$ 代表的是工程的路径,也就是 .\simple_peripheral_oad_onchip\tirtos\iar\bim_onchip。而 \..\ 代表上一级目录,所以就是将要输出的 bin 文件放置在 simple_peripheral_oad_onchip\tirtos\iar\output 中。

那么 hex2bin.exe 在哪里来呢,这里我已经打包好了,可以直接在 https://github.com/nixgnauhcuy/intelhex/releases/tag/v1.0.0 下载并放置在对应的 tools 文件夹里。

tools 文件夹主要要用来放置一下对应的工具,不需要完全参考我的。

填入上述的内容后,Rebuild 下对应的工程,就可以在 simple_peripheral_oad_onchip\tirtos\iar\output 看到 sp_oad_onchip_cc2640r2lp_bim_onchip_FlashOnly.bin文件。

到这第一个工程就完成了,第一步稍微繁琐,后面会简单许多。

3.2 app

同样的,右键 cc2640r2lp_app 工程,选择 options.. 进入选项中,找到 Build Actions,修改其中的 Post-build command line:,原始内容如下:

1
cmd /C "$TOOLS_BLE_DIR$\oad\oad_image_tool.exe iar $PROJ_DIR$ 1 -hex1 $EXE_DIR$\$TARGET_BNAME$.hex -bdf $PROJ_DIR$\..\config\iar_boundary.xcl -hex2 $PROJ_DIR$\..\stack\FlashROM\Exe\sp_oad_onchip_cc2640r2lp_stack_FlashROM.hex -k "$TOOLS_BLE_DIR$\oad\private.pem" -o $EXE_DIR$\$TARGET_BNAME$_oad"

上面的内容,简单概述下,就是使用 SDK 工程 tools\blestack\oad\oad_image_tool.exe 将编译的 hex 文件,结合 oad 密钥文件,最后输出转化为 bin 文件,有兴趣的可以在该工具目录下打开命令行,输入:

1
2
3
4
5
6
7
8
> .\oad_image_tool.exe -h
usage: oad_image_tool [-h] [-v] [-verbose] [-hex1 HEXPATH1] [-bdf BDFILEPATH]
[-hex2 [HEXPATH2]] [-k [KEYFILE]] -o OUTPUT
ProjType ProjDir BinaryType

OAD Hex to Binary Converter version
...
...

这里不过多赘述,我们只需将输出的文件放置到我们的 ouput 文件夹中即可,修改后内容如下:

1
cmd /C "$TOOLS_BLE_DIR$\oad\oad_image_tool.exe iar $PROJ_DIR$ 1 -hex1 $EXE_DIR$\$TARGET_BNAME$.hex -bdf $PROJ_DIR$\..\config\iar_boundary.xcl -hex2 $PROJ_DIR$\..\stack\FlashROM\Exe\sp_oad_onchip_cc2640r2lp_stack_FlashROM.hex -k "$TOOLS_BLE_DIR$\oad\private.pem" -o $PROJ_DIR$\..\output\$TARGET_BNAME$_oad"

这样第二个工程就完毕了,接下来的工程基本都这样,所以我会简单带过。

3.3 persistent_app

3.2,打开 cc2640r2lp_persistent_app

原始内容如下:

1
cmd /C "$TOOLS_BLE_DIR$\frontier\frontier.exe iar -b 1 $PROJ_DIR$\$CONFIG_NAME$\List\sp_oad_onchip_$PROJ_FNAME$_$CONFIG_NAME$.map $PROJ_DIR$\..\config\iar_oad_tgt_boundary.bdef $PROJ_DIR$\..\config\iar_oad_tgt_boundary.xcl & $TOOLS_BLE_DIR$\output_converter\output_converter.exe $EXE_DIR$\sp_oad_onchip_$PROJ_FNAME$_$CONFIG_NAME$.bin -b $PROJ_DIR$\..\config\iar_oad_tgt_boundary.bdef & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe --verbose  iar $PROJ_DIR$ 0 -hex1 $EXE_DIR$\$TARGET_BNAME$.hex -bdf $PROJ_DIR$\..\config\iar_oad_tgt_boundary.xcl -k "$TOOLS_BLE_DIR$\oad\private.pem" -o $EXE_DIR$\$TARGET_BNAME$_oad"

修改如下:

1
cmd /C "$TOOLS_BLE_DIR$\frontier\frontier.exe iar -b 1 $PROJ_DIR$\$CONFIG_NAME$\List\sp_oad_onchip_$PROJ_FNAME$_$CONFIG_NAME$.map $PROJ_DIR$\..\config\iar_oad_tgt_boundary.bdef $PROJ_DIR$\..\config\iar_oad_tgt_boundary.xcl & $TOOLS_BLE_DIR$\output_converter\output_converter.exe $EXE_DIR$\sp_oad_onchip_$PROJ_FNAME$_$CONFIG_NAME$.bin -b $PROJ_DIR$\..\config\iar_oad_tgt_boundary.bdef & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe --verbose  iar $PROJ_DIR$ 0 -hex1 $EXE_DIR$\$TARGET_BNAME$.hex -bdf $PROJ_DIR$\..\config\iar_oad_tgt_boundary.xcl -k "$TOOLS_BLE_DIR$\oad\private.pem" -o $PROJ_DIR$\..\output\$TARGET_BNAME$_oad"

3.4 stack

3.2,打开 cc2640r2lp_stack

原始内容如下:

1
cmd /C "$TOOLS_BLE_DIR$\frontier\frontier.exe  iar $PROJ_DIR$\$CONFIG_NAME$\List\$TARGET_BNAME$.map $PROJ_DIR$\..\config\iar_boundary.bdef $PROJ_DIR$\..\config\iar_boundary.xcl & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe --verbose  iar $PROJ_DIR$ 2 -hex1 $EXE_DIR$\$TARGET_BNAME$.hex -bdf $PROJ_DIR$\..\config\iar_boundary.xcl -k "$TOOLS_BLE_DIR$\oad\private.pem" -o $EXE_DIR$\$TARGET_BNAME$_oad"$PROJ_DIR$\..\output\$TARGET_BNAME$_oad"

修改如下:

1
cmd /C "$TOOLS_BLE_DIR$\frontier\frontier.exe  iar $PROJ_DIR$\$CONFIG_NAME$\List\$TARGET_BNAME$.map $PROJ_DIR$\..\config\iar_boundary.bdef $PROJ_DIR$\..\config\iar_boundary.xcl & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe --verbose  iar $PROJ_DIR$ 2 -hex1 $EXE_DIR$\$TARGET_BNAME$.hex -bdf $PROJ_DIR$\..\config\iar_boundary.xcl -k "$TOOLS_BLE_DIR$\oad\private.pem" -o $PROJ_DIR$\..\output\$TARGET_BNAME$_oad"

3.5 编译工程

上面四个工程都修改完毕后,我们对整个项目进行重编译,就可以在 .\simple_peripheral_oad_onchip\tirtos\iar\output 中看到四个对应的 .bin 文件。

03.png

那么四个主要的文件有了,就差合并了,这里我自己写了个 python 脚本合并多个 bin 文件,源码在python_script,打包文件可以在这里下载 releases

将打包好的 bin_allinone.exe 放在刚才放置 hex2bin.exe 的 tools 文件夹里。

04.png

用法可以直接输入 -h 查看对应的帮助信息,这里不多赘述,下载并放置好文件夹后,我们回到 output 这个文件夹,创建一个 .bat 脚本,名字随意,内容如下:

1
2
@echo off
..\..\..\tools\bin_allinone.exe .\sp_oad_onchip_cc2640r2lp_persistent_app_FlashOnly_oad.bin 0x14000 .\sp_oad_onchip_cc2640r2lp_app_FlashROM_oad.bin 0x0 .\sp_oad_onchip_cc2640r2lp_bim_onchip_FlashOnly.bin 0x1E000 .\sp_oad_onchip_cc2640r2lp_stack_FlashROM_oad.bin 0xB000 -p 0xff -o all_in_one.bin

复制并保存到 output 文件夹,双击运行 .bat 文件,即可在文件夹中看到输出文件,名字为 all_in_one.bin

05.png

上述的 bat 脚本可以自己定制化地址偏移,以及输出的文件名。

这样,合并就完成了。

结语

到这里,基本都没有问题了。过程中有什么不能理解的,可以留言告知我!有什么错误,也可以指出来告诉我~