天天看點

CC2640R2F藍牙5片外OAD的實作

1.OAD概述

OAD是一種裝置固件更新方法,允許使用藍牙低功耗連接配接通過無線方式更新裝置上運作的固件映像,同時提供斷電保護。OAD分為片外OAD(off-chip OAD)和片内OAD(on-chip OAD),在CC2640R2F藍牙5.0中,BLE5-Stack僅支援片外OAD。本文就是介紹如何在CC2640R2F藍牙5.0的環境中實作片外OAD更新。要實作OAD需要兩個支援BLE的裝置,筆者選擇的是兩塊CC2640R2F開發闆,作為OAD目标裝置和OAD下載下傳裝置。

OAD目标裝置(OAD Target)即我們要更新的外圍裝置。OAD Target使用啟動映像管理器也就是BIM工程來幫助固件更新,BIM在裝置重置時執行,并确定是否應用固件更新。如果沒有應用更新,則BIM就将程式執行轉移到主應用程式映像。

OAD下載下傳裝置(OAD Downloader)提供可供OAD更新的固件更新映像,将需要更新的映像檔案寫入OAD Target。過程大體情況如下圖所示

CC2640R2F藍牙5片外OAD的實作

2.片外OAD介紹

片外OAD支援分離鏡像片外OAD(Split Image Off-Chip OAD)和堆棧庫片外OAD(Library Off-Chip OAD)。也就是片外OAD支援Stack和Stack_library圖像類型。

2.1分離鏡像片外OAD(Split Image Off-Chip OAD)

分離鏡像片外OAD支援app、stack單獨更新,如果開發人員想要以額外的傳輸時間為代價更新應用程式以及堆棧,則也可以生成App + Stack OAD Image,進行app+stack更新。

其中在SimpleLink CC2640R2 SDK中存在着一個分離鏡像OAD的執行個體,叫做simple_peripheral_oad_offchip項目,具有App片外OAD的實作,被稱為開箱即用。筆者使用的是simplelink_cc2640r2_sdk_1_40_00_45版本,該項目存放在C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\ble5stack。請注意BIM工程也是位于該位址。

下面我用開箱即用為例,介紹如何将OAD更新移植到自己的産品中去。

2.1.1開箱即用

實驗環境:

協定棧版本:simplelink_cc2640r2_sdk_1_40_00_45

編譯軟體:IAR8.11 \CCS7.2.0

硬體平台:CC2640R2F LaunchPad

仿真器:XDS110

2.1.1.1用IAR來實作

要實作片外OAD,需要三個工程檔案,BIM、APP、STACK。在C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\ble5stack路徑下就可以找到三個工程,bim_oad_offchip(BIM工程),simple_peripheral_oad_offchip(其中包含了STACK和APP工程)。

對BIM工程進行處理

BIM要求在OAD更新中駐留在FLASH中,以便提供一個故障檢測機制,用于确定時候運作現有的應用程式鏡像還是從外部flash中拷貝新的鏡像到内部flash中。當有新的鏡像存在在外部FLASH中,BIM對鏡像進行CRC校驗,如果CRC校驗通過,并且沒有定義NO_COPY宏,BIM将新的鏡像複制到内部flash中,如果定義了NO_COPY宏,BIM将不會加載任何新鏡像。

打開bim_oad_offchip項目後開始修改BIM,請确定是否有将NO_COPY宏删除,如果沒有請将該宏前面加上x。具體操作如下:點選project,選中Options,選擇C/C++ Compiler,點選Preprocessor,在Defined symbols中找到NO_COPY,在前面加上x,變成xNO_COPY。接下來請在Application檔案下找到startup_iar.c,在這個函數檔案中找到void ResetISR(void)中的SetupTrimDevice()。請将SetupTrimDevice()屏蔽,如果沒有屏蔽掉,調試下會出現問題,官方給定的工程下會有bug,将這一句屏蔽掉即可。

接下來修改外部flash引腳,找到Board檔案下的bsp.h,這步可以根據自己需求來設定引腳

**//**  Board external flash defines
#define BSP_IOID_FLASH_CS      IOID_20
#define BSP_SPI_MOSI                 IOID_9
#define BSP_SPI_MISO                 IOID_8
#define BSP_SPI_CLK_FLASH      IOID_10
           

請注意:修改後的引腳不要和其它引腳重複定義,如果有重複,比如若"BSP_IOID_LED_2"也被定義為IOID_20,請将"BSP_IOID_LED_2"定義為“PIN_UNASSIGNED”

CC2640R2F藍牙5片外OAD的實作

接下來增加flash晶片型号的定義

在Middleware的ExtFlash檔案下找到ext_flash.c,預設支援四種型号的Flash,如果自己的Flash型号不在這四種内,在檔案中增加自己的flash定義,如下圖所示

CC2640R2F藍牙5片外OAD的實作

即在

{

.manfId = 0x0,

.devId = 0x0,

.deviceSize = 0x0

}

前增加

{

.manfId = 0xEF, //add our flash

.devId = 0x13,

.deviceSize = 0x100000 //1 MByte(8 Mbit)

}

其中manfId、devId、deviceSize的值要根據自己産品中使用的外部flash型号來定義。下面提供方法來查詢自己的Flash型号。

打開相關手冊的W25Q80晶片手冊_EN,輸入“Device ID”查詢,在10.2.1 Manufacturer and Device Identification,如下圖

CC2640R2F藍牙5片外OAD的實作

可以看到自己的Flash的資訊,W25Q80的manfld是0xEF,devId是0x13,也可以在CC2640R2的外設教程中看到自己的Flash型号和大小。

對APP工程進行處理

打開simple_peripheral_oad_offchip項目,選中cc2640r2lp_app-FlashROM_OAD_Offchip(APP工程),在Middleware的ExtFlash檔案下找到ExtFlash.c,和在BIM工程中處理的一樣,加入自己的Flash型号。接下來在Startup檔案的board.c下找到CC2640R2_LAUNCHXL.c,将Flash對應的SPI的引腳定義為和BIM工程的bsp.h一樣,如圖

CC2640R2F藍牙5片外OAD的實作

這裡也請注意,不要将引腳重複定義,将重複的引腳定義為“PIN_UNASSIGNED”即可,如同BIM工程一樣處理。

2.1.1.2用CCS來實作

同樣需要三個工程檔案,BIM、APP、STACK。将bim_oad_offchip(BIM工程)和simple_peripheral_oad_offchip(其中包含了STACK和APP工程)導入CCS中。

點選BIM工程,變為ble5_bim_oad_offchip_cc2640r2lp_app[Active-FlashOnly],右鍵點選Properties,選擇ARM Compiler的Predefined Symbols,在右邊的Pre-define NAME(–define,-D)加入xNO_COPY。接下來找到Application檔案的startup_ccs.c,将Setup TrimDevice()屏蔽。在bsp.h檔案中,修改外部flash引腳定義,在ext_flash.c檔案中,加入Flash型号,和在IAR中配置的一樣,這裡就不在贅述。

點選APP工程,找到CC2640R2_LAUNCHXL.h和ExtFlash.c修改外部flash引腳定義和增加flash晶片型号定義,和上面用IAR實作的步驟一樣。

2.1.1.3将工程燒錄進開發闆

運作Setup_SmartRF_Flash_Programmer_2.exe,安裝SmartRF Flash Programmer 2。将開發闆插入PC端,打開SmartRF Flash Programmer 2,右邊的Connected devices顯示目前連接配接的開發闆,右鍵連接配接,這個開發闆是作為OAD Target裝置。将BIM、stack、app工程編譯生成三個hex檔案,點選Multiple,将三個hex檔案燒錄進OAD Target裝置

CC2640R2F藍牙5片外OAD的實作
CC2640R2F藍牙5片外OAD的實作

2.1.1.4用BLE Device Monitor和BTOOL來幫助片外OAD更新

網上有的人說BLE Device Monitor可以實作OAD更新,但筆者自己試了幾次,發現CC2640R2F藍牙5.0的更新存在問題,是以建議大家用官方自帶的BTOOL。

BTOOL是一個用于藍牙裝置調試的PC軟體工具,可以在C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\tools\ble5stack\btool路徑下找到它,打開即可。現在就需要用到OAD Downloader裝置,該裝置必須要燒寫運作主機測試示例應用程式cc2640r2lp_host_test.hex,這個檔案可以在C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\hexfiles下找到,利用SmartRF Flash Programmer燒寫進OAD Downloader裝置即可。将OAD Downloader裝置插入PC端,這樣打開BTOOL後就可以接收廣播到的裝置資訊。端口等資訊按下圖設定即可。

CC2640R2F藍牙5片外OAD的實作

下面點選Scan按鍵,搜尋現在正在廣播的裝置,選中OAD Target裝置的位址,點選Establish,界面右邊就會顯示連接配接的OAD Target裝置位址,這樣就說明已經連接配接上了。有關步驟可參見下圖。

CC2640R2F藍牙5片外OAD的實作

如若不知道自己的OAD Target裝置位址,可以通過SmartRF Flash Programmer 2進行檢查,打開它,連接配接裝置,在界面上方選擇MAC Address,在Primary address中“read”BLE MAC address,就可以顯示自己的裝置位址。

選擇BTOOL中的OAD選項并啟動OAD過程。

CC2640R2F藍牙5片外OAD的實作

在這個過程中,為了驗證OAD是否成功 ,可以通過更改藍牙裝置的名稱來确定。可以在APP工程中的simple_peripheral.c找到,如下圖所示。

CC2640R2F藍牙5片外OAD的實作

可以更改圖中藍色字元來改變藍牙裝置廣播名稱,注意,如若删除增加字元,請相應的将長度也改變。将生成的bin檔案放入BTOOL中,發送。

OAD的流程繼續如下

CC2640R2F藍牙5片外OAD的實作

當顯示如下則說明OAD更新已然成功。

CC2640R2F藍牙5片外OAD的實作
CC2640R2F藍牙5片外OAD的實作

當然,這裡隻是BTOOL說明OAD更新成功了,自己還要進行驗證。将OAD Target裝置從PC端拔下(如若單單按下重新開機按鍵會出現HIB現象,是以筆者建議拔電重新開機),拔電重新開機後打開BLE Device Monitor,搜尋正在廣播的裝置,可以發現搜尋到的藍牙裝置中有自己命名的OAD Target就說明OAD真正成功了。

2.2堆棧庫片外OAD(Library Off-Chip OAD)

支援APP+STACK的更新,由于藍牙5項目大部分都是堆棧庫項目,下面來介紹如何在現有項目裡加入OAD功能。

以下所有的更改都是基于APP工程,對STACK工程不需要更改。

1.bim_oad_offchip工程按原樣使用項目,不需要更改。

2.将OAD配置檔案代碼添加到應用程式項目:

可以在C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\source\ti\ble5stack\profiles\oad\cc26xx找到所需檔案。

oad.c

oad.h

oad_target.h

oad_target_external_flash.c

方法如下,下同。

CC2640R2F藍牙5片外OAD的實作

3.将外部flash中間件添加到應用程式項目

可以在C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\source\ti\mw\extflash找到。

ExtFlash.c

ExtFlash.h

4.為項目添加必要的包含路徑:

點選"Options",選擇C/C++Compiler,在Preprocessor中的Additional include directories,增加C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\source\ti\ble5stack\profiles\oad\cc26xx路徑。

5.使用适當的片外OAD連結器檔案并正确配置它。

IAR項目應該使用:

cc26xx_app_oad.icf

CCS項目應使用:

cc26xx_app_oad.cmd

在IAR的項目中修改cc26xx_app_and_stack.icf

5.1.定義應用程式和堆棧代碼和資料的位置

//Code and RO Data

place in FLASH_ALL {readonly};
           

改為

place in FLASH {readonly};
           

5.2.接下來重新定義FLASH,使得它從未定義的符号OAD_FLASH_START到FLASH_END,OAD_FLASH_START表示應用程式/堆棧代碼可以開始的位置。

define region FLASH = men:[from OAD_FLASH_START to FLASH_END];
           

5.3.定義OAD中繼資料的符号:

//OAD specific
define symbol OAD_HDR_SIZE = 16;//size of metadata vector
define symbol OAD_HDR_START = FLASH_START;
define symbol OAD_HDR_END  = OAD_HDR_START+OAD_HDR_SIZE-1
           

5.4.定義OAD_FLASH_START,計算中繼資料向量以及中斷表:

define symbol OAD_FLASH_START = INT_VEC_START + INT_VEC_SIZE;
           

注意:要完全定義OAD_FLASH_START需要考慮中斷向量表,請接下一步。

5.5.需要放置中斷向量表,以使應用程式正常運作。通常,表格會在閃存開始時開始; 但是,由于中繼資料向量,需要移動表。

首先定義符号來表示表:

define symbol INT_VEC_SIZE    = 64;
define symbol INT_VEC_START   = OAD_HDR_START + OAD_HDR_SIZE;
define symbol INT_VEC_END     = INT_VEC_START + INT_VEC_SIZE - 1;
           

最後,對于記憶體放置,需要添加以下内容,以便.intvec正确放置該部分:

// Interrupt Vector Table
place at start of INT_VEC       { readonly section .intvec };
keep                            { readonly section .intvec };
           

注意:添加後删除原有的代碼

5.6.删除以下行

// CCFG
place at end of FLASH_LAST_PAGE { readonly section .ccfg };
keep { section .ccfg };
           

6.在應用程式中添加預處理器定義:

FEATURE_OAD

HAL_IMAGE_E

7.在pre-build中添加OAD_IMAGE_E

CC2640R2F藍牙5片外OAD的實作

您可能需要更改OAD_IMG_E=1為OAD_IMG_A=1或OAD_IMG_B=1根據您的使用的版本情況

8.更改外部FLASH的引腳配置設定情況,這個根據自己情況設定,因為在分離鏡像中已經叙述,這裡不再重複。

9.更新OAD圖像工具建構步驟,生成帶有校驗的bin檔案

CC2640R2F藍牙5片外OAD的實作

在Post-build command line中更改為

cmd /C "$TOOLS_BLE_DIR$\output_converter\output_converter.exe $EXE_DIR$\$TARGET_BNAME$.bin -a 0x10 & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe $EXE_DIR$\$TARGET_BNAME$.hex -t offchip -i app --imgVer 0 -ob $EXE_DIR$\$TARGET_BNAME$.bin -m 0x0000 --r 0x0000"

經過上述步驟就完成了在現有項目中加入OAD的功能,編譯後将hex和BIM的hex檔案一起燒錄進OAD Target裝置。接下來進行OAD更新,方法和開箱即用的相同,這裡不再叙述。

參考文檔:file:///C:/ti/simplelink_cc2640r2_sdk_1_40_00_45/docs/ble5stack/ble_user_guide/html/oad/oad_offchip.html