測試環境
協議棧版本:BLE-STACK V2.1
IAR開發環境版本:IAR for Arm 7.40
硬件設備:Amo-SmartRF v2.0 開發板(對應TI官方的SmartRF06EB 開發板)
示例測試Demo工程:HeartRate工程
測試工具:BLE Device Monitor(PC)
配置ImageB
我們選擇“HeartRate”工程來做演示,因爲協議棧中的一些工程本身就已經配置ImageB,而“HeartRate”工程本身默認是沒有配置ImageB的。
1.“CC2640App”中基於現有工程配置“FlashROM”創建一個新的工程配置,點擊IAR菜單欄上“Project”,下拉菜單中選擇“Edit Configurations...”,操作截圖如下:
點擊之後,彈出如下對話框:
輸入新的工程配置名“FlashOnly_OAD_ImgB”,然後點“OK”之後顯示如下:
繼續點“OK”,當前的工程配置就會切換到“FlashOnly_OAD_ImgB”。如下所示:
2.在工程名“CC2640App-FlashOnly_OAD_ImgB”上點擊鼠標右鍵,下拉菜單中選擇“Options...”,彈出工程配置對話框,截圖如下:
在上圖的配置框中,我們對其中的選項做如下配置:
(1)點擊“C/C++ Compiler”---->“Preprocessor”。
在下面的“Additional include directories:(one per line)”中輸入:
$PROJ_DIR$/../../../../../../../Projects/ble/Profiles/OAD/CC26xx
在“Defined symbols:”中輸入:
ICALL_STACK0_ADDR=0xF000
FEATURE_OAD_ONCHIP
IMAGE_INVALIDATE
HAL_IMAGE_B
操作截圖如下:
另外,注意“HeartRate”的工程默認是不廣播的,我們爲了方便測試,修改爲開機啓動就廣播,所以我們需要將“ADVERTISE_WHEN_NOT_CONNECTED”定義爲“TRUE”,截圖如下:
注意:這個地方要根據你自己的工程情況來定,不是ImageB配置過程中必須嚴格參照修改的。
(2)點擊“Build Acions”。
在“Post-build command line:”下的輸入框中輸入:
python "C:\Python27\Scripts\hex2bin.py" -r "6000:EFFF"
"$PROJ_DIR$\FlashOnly_OAD_ImgB\Exe\HeartRateAppFlashROM.hex"
"$PROJ_DIR$\FlashOnly_OAD_ImgB\Exe\OADbin.bin"
這裏有幾點需要注意的:
首先,上面三行輸入進去的時候,每兩行之間是一個空格,如果最後沒有編譯成功,就把全部命令複製出來確認一下。其次,注意路徑和文件名,比如:
"$PROJ_DIR$\FlashOnly_OAD_ImgB\Exe\HeartRateAppFlashROM.hex"
這一條中的路徑是我工程中的路徑,確定下你的是不是,不是就改一下,而“HeartRateAppFlashROM.hex”文件是編譯生成的hex文件,確定下你的工程生成的文件名,然後對應修改一下。
上述操作截圖如下:
(3)點擊“Linker”---->“Config”
在“Linker configuration file”下選擇或者直接輸入:
$PROJ_DIR$\..\..\..\..\..\common\cc26xx\IAR\cc26xx_ble_app_oad.icf
在“Configuration file symbol definitions:”下輸入:
FLASH_ONLY_BUILD=1
操作截圖如下:
(4)點擊“Linker”---->“Checksum”
默認的配置截圖如下:
首先,將“Fill unused memory”前的小框打上勾,然後將“Start”的值改爲“0x6004”,將“End address”的值改爲“0xEFFF”。其次,將“Generate checksum”前的小框打上勾,確定“Algorith”選擇的是“CRC16”,並且其值爲“0x1021”,默認的值並不是這個,而在“CRC16”模式下不能改這個值,所以我們先將“Algorith”選擇爲“CRC polynomial”,然後將後面的值修改爲“0x1021”,然後再將“Algorith”選擇爲“CRC16”。
修改之後的截圖如下:
這樣,工程配置文件中的修改就結束了。
3.在IAR左側工作區,右鍵點擊“PROFILES”文件夾,下拉菜單選擇“Add”,然後選擇“Add Files...”,操作截圖如下:
點擊之後,彈出如下文件選擇框,然後到
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\Profiles\OAD\CC26xx”路徑下選擇“oad.c”、“oad.h”、“oad_target_internalFlash.c”和“oadResetService.c”四個文件,操作截圖如下:
選中之後,點“打開”即可。
4.當ImageB升級的時候,如果Flash中的“page 0”不能被升級,那ImageB就不應該使用ROM中的TI-RTOS,所以需要將
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\IAR\Config”目錄下的“appBLE.cfg”文件開頭的如下兩行代碼屏蔽掉:
//var ROM = xdc.useModule('ti.sysbios.rom.ROM');
//ROM.romName = ROM.CC2650;
操作截圖如下:
5.配置添加使ImageB無效化的服務和特徵值
打開
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\HeartRate\CC26xx\Source\Application”目錄下的“heartRate.c”文件。
(1)頭文件引用部分添加如下代碼:
#if defined(FEATURE_OAD) || defined(IMAGE_INVALIDATE)
#include "oad_target.h"
#include "oad.h"
#endif //FEATURE_OAD || IMAGE_INVALIDATE
(2)在“HeartRate_init”初始化函數中添加如下代碼:
#ifdef IMAGE_INVALIDATE
Reset_addService();
#endif //IMAGE_INVALIDATE
操作截圖如下:
6.重新編譯CC2640App,會在如下路徑下:
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\HeartRate\CC26xx\IAR\Application\
CC2640\FlashOnly_OAD_ImgB\Exe”
下生成“OADbin.bin”文件,這就說明配置編譯完成了。
修改ImageB的版本號
打開“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\Profiles\OAD\CC26xx”目錄下的“oad_target_internalFlash.c”文件,在文件的開頭有個定義版本的宏:
#if !defined (OAD_IMAGE_VERSION)
#define OAD_IMAGE_VERSION 0x0000
#endif // OAD_IMAGE_VERSION
如果我們想把ImageB的版本修改爲1,那我們就如下修改即可:
#if !defined (OAD_IMAGE_VERSION)
#define OAD_IMAGE_VERSION 0x0001
#endif // OAD_IMAGE_VERSION
修改之後,重新編譯ImageB即可。
這樣,我們的ImageB手動配置的過程就瞭解完了,如果你的工程本身沒有配置ImageB,那你就可以參照上面的方法進行配置。至於燒錄過程以及整個OAD的過程可以參看另一篇博文,鏈接地址如下: