CC2640 OAD 生产烧录单文件实现
CC2640 OAD 生产烧录单文件实现
nixgnauhcuy1 前言
在使用 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_onchip
、app
、persistent_app
和 stack
,这些工程代表的意义这里就不赘述了,对这篇文章感兴趣的,相信应该对这些已经有一定的了解。
这四个工程对应的文件夹如图所示,
对整个项目进行编译后,会依次在下述几个路径生成对应的编译文件:
1 | .\simple_peripheral_oad_onchip\tirtos\iar\app\FlashROM\Exe |
生成的编译文件包括了 .out
、.hex
、.bin
等,因为是烧录文件,并不需要附带调试信息和地址信息,那么 .bin
文件就是我们需要的目标,那么每次烧录四个 .bin
文件,就需要到这四个路径下找到该文件,属实有点繁琐,那么第一步,我们就先把需要的文件归并到一个目录去。
3.1 bim_onchip
进入 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 | > .\oad_image_tool.exe -h |
这里不过多赘述,我们只需将输出的文件放置到我们的 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
文件。
那么四个主要的文件有了,就差合并了,这里我自己写了个 python 脚本合并多个 bin 文件,源码在python_script,打包文件可以在这里下载 releases。
将打包好的 bin_allinone.exe
放在刚才放置 hex2bin.exe 的 tools 文件夹里。
用法可以直接输入 -h 查看对应的帮助信息,这里不多赘述,下载并放置好文件夹后,我们回到 output
这个文件夹,创建一个 .bat
脚本,名字随意,内容如下:
1 | @echo off |
复制并保存到 output
文件夹,双击运行 .bat
文件,即可在文件夹中看到输出文件,名字为 all_in_one.bin
。
上述的 bat 脚本可以自己定制化地址偏移,以及输出的文件名。
这样,合并就完成了。
结语
到这里,基本都没有问题了。过程中有什么不能理解的,可以留言告知我!有什么错误,也可以指出来告诉我~