CC2640R2: 靈活使用 IDE 的 post-build 功能來生成用於量產或者 OAD 的單個固件文件

作者: TI 工程師 張彥

CC2640 R2是一款面向 Bluetooth Smart 應用的低功耗無線 MCU。該晶元運行TI的BLE協議棧,同時具有OAD(Over the Air Download)空中固件升級功能。

CCS是TI提供的強大的MCU/Processor免費軟體開發IDE,支持TI全系列的MCU和Processor。IAR是IAR公司提供的商用軟體開發IDE。CC2640R2可以選用CCS或者IAR任意一款進行開發。

為了提高OAD的效率,同時為了更合理的代碼架構,TI的BLE常式都分為Application和Stack兩個工程。但是兩個工程和兩個固件,往往會造成生產或者OAD的不便,在此我們提供一個小竅門來改善一下這個不便。

首先我們看一下IAR/CCS的編譯結果:

IAR和CCS是開發TI的BLE方案的IDE工具。在代碼編譯完成後,都能生供下載調試用的.out文件,還有.hex文件和.bin文件。

其中.out文件帶了調試信息,主要是下載調試用。.hex文件和.bin文件都可以用於生產下載,但是.hex文件又帶了地址信息,crc校驗等額外信息,所以.out和.hex都會比.bin文件大很多。因此最理想的生產下載文件其實還是.bin文件,同樣,對於目前CC2640R2F的OAD功能來說,.bin文件也依然是最佳選擇。

圖 1. 編譯結果

我們再來看一下CC2640R2帶OAD特性的工程:

CC2640R2帶OAD特性的工程由三個子工程構成,BIM,application和stack。

BIM其實就是bootloader,app就是application,stack就是協議棧。

這樣的好處是升級的時候可以只單獨更新application部分,並且能大大提高OAD的速度(因為對大多數客戶來說實際只需要更新application部分)。

但是這樣做的結果就有了三個獨立image文件,這會對最終的生產造成困擾。好在IAR或CCS等IDE工具提供了一些方法,能使我們靈活在.hex文件和.bin文件之間互相轉換,合併等等,這就是它們提供的post-build工具:post-build顧名思義就是build之後的動作。

先來看一下IAR/CCS的Post-build工具:

以Application工程為例。

IAR的Post-build工具:

圖 2. IAR Post-build

CCS的Post-build 工具:

圖 3. CCS Post-build

把IAR和CCS的Post-build 內容拿出來,分別是:

IAR的Post-build內容:

cmd /C "$TOOLS_BLE_DIR$output_converteroutput_converter.exe

$EXE_DIR$sp_oad_offchip_$PROJ_FNAME$_$CONFIG_NAME$.bin & $TOOLS_BLE_DIR$oadoad_image_tool.exe

iar $PROJ_DIR$ 1 $EXE_DIR$$TARGET_BNAME$.hex $PROJ_DIR$..configiar_boundary.xcl

$PROJ_DIR$..stackFlashROMExesp_oad_offchip_cc2640r2lp_stack_FlashROM.hex -o

$EXE_DIR$$TARGET_BNAME$_oad"

CCS的Post-build內容:

${TOOLS_BLE_DIR}/oad/oad_image_tool ccs ${PROJECT_LOC} 1 FlashROM/${ProjName}_${ConfigName}.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/TOOLS/ccs_compiler_defines.bcfg ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/FlashROM/simple_peripheral_cc2640r2lp_oad_offchip_stack_FlashROM.hex -o ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad

上面標紅的就是CC2640R2的SDK提供的一些腳本工具,可以在這個目錄中找到:C:TIsimplelink_cc2640r2_sdk_1_40_00_45 oolslestack。分別是

output_converter.exe和

oad_image_tool.exe。

SDK提供的這幾個.exe文件都是Python文件轉換過來的,我們也可以把自己用Python轉成的.exe文件放這裡來執行。

上述腳本工具在Post-build中的應用

output_converter.exe的用法:

output_converter.exe的作用:把.bin文件轉換成.hex文件。

用windows的command line可以看到它的參數配置:

圖 4. output_converter.exe的參數配置

oad_image_tool.exe的用法:

oad_image_tool.exe的作用:把特定的1個,或者多個.hex文件合併,新生成一個.hex文件,並轉換成加上CRC32校驗信息的.bin文件,注意的是,新生成的.hex文件是沒有加上CRC32校驗信息的,只有新生成的.bin文件帶。

它是特別指定了OAD要用的BIM,application,stack三個工程的某種組合,且合併的話,只能合併application和stack工程的image,所以這個工具並不是通用.hex轉.bin工具,只能配合OAD用(文章後面會有通用.hex轉.bin工具介紹)。

圖 5. oad_image_tool.exe的參數配置

*注意:這裡說的都是application工程,編譯application工程之前,stack工程必須先編譯完成。因為很顯然,stack工程的.hex文件是其中的一個參數。

output_converter.exe & oad_image_tool.exe的配合:

IAR的工程配置裡面,配置的是編譯好默認輸出.bin文件,所以需要先用output_converter.exe把.bin文件轉換成.hex。

CCS則是直接生成.hex文件,CCS只要調用oad_image_tool.exe轉換成帶CRC32校驗信息的.bin文件就可以了。

所以最後總結,不管是IAR還是CCS,都是通過post-build來轉換application和stack工程的編譯結果,併產生這兩個工程單個合併的.hex和.bin文件(BIM工程並不在合併之列),產生的.bin文件是帶OAD需要的CRC32的image校驗信息的,而.hex文件是不帶這個CRC32校驗信息的。

在Post-build中活用腳本工具:

用hex的方法燒錄

如果用.hex的方式去燒錄,這中間就有兩個問題:

  • 第一就是還是得燒錄兩個.hex文件:BIM的.hex,和application+stack合併的.hex。
  • 第二就是,默認的post-build產生的.hex文件不帶CRC32信息,如果直接把最終產生的單個.hex文件和BIM工程的.hex文件燒錄至晶元,由於application鏡像的起始位置不帶有效的CRC32信息,因此BIM會認為這是無效的鏡像,最後造成無法跳轉到application去執行。

要解決這兩個問題,就得在application+stack的.hex起始位置加上有效CRC32校驗信息,然後把BIM的.hex文件和application+stack的.hex文件合併,變成真正的單個.hex,這樣直接下載就沒問題了。

解決方法:

  • 首先,給application+stack的.hex文件頭部相應位置加入CRC32信息。

實際上經過oad_image_tool.exe合併的application+stack的.bin文件的頭部已經有CRC32校驗信息,而且output_converter.exe能把.bin文件轉成.hex文件,所以最快的方法自然是用output_converter.exe把已經合併的application+stack的.bin文件再轉換成.hex就行了:

$TOOLS_BLE_DIR$output_converteroutput_converter.exe -o

$EXE_DIR$$TARGET_BNAME$_oad_merged_crc32.hex $EXE_DIR$$TARGET_BNAME$_oad_merged.bin"

這個產生的.hex就是application+stack,並帶CRC32信息。

  • 接下來就是把BIM的.hex和application+stack帶CRC32信息的.hex 合併。

由於SDK提供的oad_image_tool.exe是一個特殊的工具,並不能隨意合併任意的.hex文件,所以不能用這個工具來合併BIM和application+stack的.hex文件。這裡提供一個能合併任意.hex文件的工具:hexmerge.exe,這個也是通過python轉換的.exe文件,後面會介紹怎麼轉換的。

把hexmerge.exe放到對應目錄下,比如:C:TIsimplelink_cc2640r2_sdk_1_40_00_45 oolslestackoad

用法:

$TOOLS_BLE_DIR$oadhexmerge.exe -o $EXE_DIR$im_app_stack_crc32.hex $PROJ_DIR$..im_offchip

FlashOnly Exesp_oad_offchip_cc2640r2lp_bim_offchip_FlashOnly.hex

$EXE_DIR$$TARGET_BNAME$_oad_merged_crc32.hex

把上面兩條命令加入到post-build中去,下面藍色部分:

cmd /C "$TOOLS_BLE_DIR$output_converteroutput_converter.exe $EXE_DIR$sp_oad_offchip_$PROJ_FNAME$_$CONFIG_NAME$.bin & $TOOLS_BLE_DIR$oadoad_image_tool.exe iar $PROJ_DIR$ 1 $EXE_DIR$$TARGET_BNAME$.hex $PROJ_DIR$..configiar_boundary.xcl $PROJ_DIR$..stackFlashROMExesp_oad_offchip_cc2640r2lp_stack_FlashROM.hex -o $EXE_DIR$$TARGET_BNAME$_oad &$TOOLS_BLE_DIR$output_converteroutput_converter.exe -o $EXE_DIR$$TARGET_BNAME$_oad_merged_crc32.hex $EXE_DIR$$TARGET_BNAME$_oad_merged.bin & $TOOLS_BLE_DIR$oadhexmerge.exe -o $EXE_DIR$bim_app_stack_crc32.hex$PROJ_DIR$..im_offchipFlashOnlyExesp_oad_offchip_cc2640r2lp_bim_offchip_FlashOnly.hex $EXE_DIR$sp_oad_offchip_cc2640r2lp_app_FlashROM_oad_merged_crc32.hex"

這樣,最終就能產生出一個bim+application+stack三個工程合併後的.hex文件,並且帶CRC32校驗,一次性下載到晶元後能直接運行。

用bin的方法燒錄

如果用.bin的方式燒錄,那麼CRC32的問題是不存在的,存在的唯一問題就是:

  • BIM的.bin和application+stack的.bin是兩個獨立的文件,沒法同時燒錄,也沒法分別燒錄,因為.bin文件是不帶地址信息的,比較麻煩。

最好的方法當然是把這幾個.bin文件合成一個,再進行燒錄。但SDK提供的oad_image_tool.exe又不能直接把BIM合併進去產生.bin文件,所以還是需要藉助其他工具。

其實根據前面的啟發,最快的方法,只要把前面的過程中產生的BIM+application+stack並帶CRC32校驗的.hex文件直接轉換成.bin文件就行了。我們借用hex2bin.exe這個工具,同樣,也是python轉換過來的.exe。

解決方法:

  • 首先,比如也把hex2bin.exe放到下面目錄中:

C:TIsimplelink_cc2640r2_sdk_1_40_00_45 oolslestackoad

用法:

$TOOLS_BLE_DIR$oadhex2bin.exe $EXE_DIR$im_app_stack_crc32.hex $EXE_DIR$im_app_stack_crc32.bin

那麼把這條命令加到post-build中去:

cmd /C "$TOOLS_BLE_DIR$output_converteroutput_converter.exe $EXE_DIR$sp_oad_offchip_$PROJ_FNAME$_$CONFIG_NAME$.bin & $TOOLS_BLE_DIR$oadoad_image_tool.exe iar $PROJ_DIR$ 1 $EXE_DIR$$TARGET_BNAME$.hex $PROJ_DIR$..configiar_boundary.xcl $PROJ_DIR$..stackFlashROMExesp_oad_offchip_cc2640r2lp_stack_FlashROM.hex -o $EXE_DIR$$TARGET_BNAME$_oad &$TOOLS_BLE_DIR$output_converteroutput_converter.exe -o $EXE_DIR$$TARGET_BNAME$_oad_merged_crc32.hex $EXE_DIR$$TARGET_BNAME$_oad_merged.bin & $TOOLS_BLE_DIR$oadhexmerge.exe -o $EXE_DIR$bim_app_stack_crc32.hex$PROJ_DIR$..im_offchipFlashOnlyExesp_oad_offchip_cc2640r2lp_bim_offchip_FlashOnly.hex $EXE_DIR$sp_oad_offchip_cc2640r2lp_app_FlashROM_oad_merged_crc32.hex & $TOOLS_BLE_DIR$oadhex2bin.exe $EXE_DIR$im_app_stack_crc32.hex $EXE_DIR$bim_app_stack_crc32.bin"

所以總結起來,只要把上面的這一整段命令複製,粘帖到IAR的post-build配置中去,我們就能通過IAR的一次編譯,自動同時可以得到一個合併了BIM,application,stack的完整的.hex和.bin文件(bim_app_stack_crc32.hexbim_app_stack_crc32.bin),可以用於燒錄。

圖 6. IAR 最終生成的編譯結果

在CCS中的靈活用法

前面是基於IAR的配置方式,基於CCS的本質上也是一樣,在post-build中,加入:

${TOOLS_BLE_DIR}/oad/oad_image_tool ccs ${PROJECT_LOC} 1 FlashROM/${ProjName}_${ConfigName}.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/TOOLS/ccs_compiler_defines.bcfg ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/FlashROM/simple_peripheral_cc2640r2lp_oad_offchip_stack_FlashROM.hex -o ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad

${TOOLS_BLE_DIR}/output_converter/output_converter -o

${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad_merged_crc32.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad_merged.bin

${TOOLS_BLE_DIR}/oad/hexmerge -o ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/bim_app_stack_crc32.hex ${WORKSPACE_LOC}/bim_oad_offchip_cc2640r2lp_app/FlashOnly/bim_oad_offchip_cc2640r2lp_app.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad_merged_crc32.hex

${TOOLS_BLE_DIR}/oad/hex2bin

${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/bim_app_stack_crc32.hex

${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/bim_app_stack_crc32.bin

這樣,編譯完application工程後,就能自動得到合併了BIM+application+stack的.hex和.bin文件(bim_app_stack_crc32.hexbim_app_stack_crc32.bin)。

圖 7. CCS 最終生成的編譯結果

結論:

IDE工具的Post-build往往在實際開發過程中容易被忽略,其實只要靈活應用,還是能幫助我們做很多事情的,比如本文所說針對CC2640R2F的固件的生成,靈活應用Post-build功能就能方便產生我們自己需要的固件,提高工作效率。

學習更多技術知識,請關注電子研習社


推薦閱讀:

2016年全球十大MCU供應商排名,NXP超過瑞薩居首|半導體行業觀察
76行代碼如何完成一個雙輪平衡小車?
美國大學數學助理教授給您講解為什麼通貨膨脹不貶值DCEU的30億票房,為什麼依然是DCEU勝出。
物聯網與人工智慧加持 MCU老樹開新花

TAG:電子工程師 | IDE集成開發環境 | MCU |