1. 程式人生 > >CC2640R2F藍芽5片外OAD的實現

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。過程大體情況如下圖所示
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”
SPI引腳設定
接下來增加flash晶片型號的定義
在Middleware的ExtFlash檔案下找到ext_flash.c,預設支援四種型號的Flash,如果自己的Flash型號不在這四種內,在檔案中增加自己的flash定義,如下圖所示
在這裡插入圖片描述
即在
{
.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,如下圖
在這裡插入圖片描述
可以看到自己的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一樣,如圖
在這裡插入圖片描述
這裡也請注意,不要將引腳重複定義,將重複的引腳定義為“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裝置
在這裡插入圖片描述
在這裡插入圖片描述

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後就可以接收廣播到的裝置資訊。埠等資訊按下圖設定即可。
在這裡插入圖片描述
下面點選Scan按鍵,搜尋現在正在廣播的裝置,選中OAD Target裝置的地址,點選Establish,介面右邊就會顯示連線的OAD Target裝置地址,這樣就說明已經連線上了。有關步驟可參見下圖。
在這裡插入圖片描述
如若不知道自己的OAD Target裝置地址,可以通過SmartRF Flash Programmer 2進行檢查,開啟它,連線裝置,在介面上方選擇MAC Address,在Primary address中“read”BLE MAC address,就可以顯示自己的裝置地址。
選擇BTOOL中的OAD選項並啟動OAD過程。
在這裡插入圖片描述
在這個過程中,為了驗證OAD是否成功 ,可以通過更改藍芽裝置的名稱來確定。可以在APP工程中的simple_peripheral.c找到,如下圖所示。
在這裡插入圖片描述
可以更改圖中藍色字元來改變藍芽裝置廣播名稱,注意,如若刪除增加字元,請相應的將長度也改變。將生成的bin檔案放入BTOOL中,傳送。
OAD的流程繼續如下
在這裡插入圖片描述
當顯示如下則說明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
方法如下,下同。
在這裡插入圖片描述
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
在這裡插入圖片描述
您可能需要更改OAD_IMG_E=1為OAD_IMG_A=1或OAD_IMG_B=1根據您的使用的版本情況

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

9.更新OAD影象工具構建步驟,生成帶有校驗的bin檔案
在這裡插入圖片描述
在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