實驗環境
1.軟件:
協議棧版本:BLE-STACK SDK V2.2
Python版本:Python 2.7.x (v2.7.10 or higher)
燒錄軟件版本:Flash Programmer 2 v1.7.4
PC端升級工具版本:BLE Device Monitor 2.5.0
IAR開發環境版本:IAR for Arm 7.80.4
示例測試Demo工程:simple_peripheral 工程
2.硬件:
CC2640開發板
OAD升級方式
對於CC2640的OAD升級有兩種方式:片內和片外。二者的區別在於通過OAD下載的鏡像存放的位置不同。片內OAD升級,下載的鏡像被寫到了芯片內部flash中存儲,運行的時候也是從內部flash加載程序運行;片外OAD升級,下載的鏡像被寫到外部Flash中存儲,一般情況下通過SPI或者I2C進行數據通信,運行的時候從外部Flash中加載程序運行。
可以通過下圖,來大致瞭解下二者的區別:
OAD狀態碼
OAD升級過程會出現一些狀態反饋,較長出現的狀態列表及描述如下圖:
注:元數據被定義爲:描述數據的數據,對數據及信息資源的描述性信息。在這個地方用來描述鏡像的有關內容。
OAD升級步驟
對於外部Flash OAD升級的地址劃分情況如下圖所示:
接下來,我們具體來看一下編譯和升級步驟:
BIM
BIM介紹
這部分屬於BootLoader,引導程序的運行。對於該部分,有個宏定義需要介紹一下,就是“NO_COPY”,如果定義了該宏,那升級的板子運行的時候將忽略鏡像檢查,直接跳轉到片內Flash的鏡像中運行,這種情況大多在外部Flash存儲的鏡像出現問題時修復設備時使用,可以讓設備直接跳轉到片內Flash的鏡像運行,然後重新升級外部Flash中的鏡像,進而解決問題;如果沒有定義該宏,設備啓動的時候將會按照下面截圖中的流程圖來運行:
編譯BIM
1.用IAR工具打開外部Flash的BIM工程,我的協議棧是安裝在E盤,所以IAR工程文件位於“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\util\bim_extflash\cc2640\iar”目錄下,將“bim_extflash.eww”工程文件拉到打開的IAR開發工具的左側工作區即可打開工程。
2.切換工程配置,選擇“FlashOnly_LP”,選擇之後的截圖顯示如下:
3.在工程名上點擊鼠標右鍵,下拉菜單中選擇“Options...”,打開工程配置界面,選擇“C/C++ Compiler”--->“Preprocessor”,確定“Defined symbols:”中的“NO_COPY”未定義,也就是前面加個“x”,關於此處修改的原因在前面已經說明過了。
4.配置SPI引腳,默認simple_peripheral工程是通過SPI與外部Flash通信的,相應的SPI通信接口都已經添加配置好了(當然也可以配置其他通信方式,比如I2C,如果選擇這種通信方式,需要自行研究下配置)。根據自己手頭開發板或者產品板的原理圖,配置SPI通信的四個引腳,代碼工程中修改的文件爲
“E:\ti\simplelink\ble_sdk_2_02_01_18\src\examples\util\bim_extflash\cc2640\board\cc2650lp\bsp.h”,修改的地方截圖顯示如下:
注意:如果修改的引腳在上面有重複的,比如你的板子上“BSP_IOID_FLASH_CS”接的是“IOID_6”,而這個時候原本定義爲這個引腳的“BSP_IOID_LED_1”硬件上沒有使用,那這個時候需要將“BSP_IOID_LED_1”定義爲“PIN_UNASSIGNED”。一定要避免引腳重複定義。
5.配置外部Flash的型號,SDK中的示例工程中默認是配置了4種Flash型號,截圖顯示如下:
默認支持這4種型號的Flash,如果你的Flash型號不在這四種內,那需要將你的Flash的型號等信息填寫到這個數組中,那我們如何知道自己所用Flash的信息呢?有下面兩種方法可供選擇:
第一種:查詢所用Flash的datasheet文檔。
打開所用Flash的datasheet,搜索“Device ID”,我們可以找到如下截圖的信息:
上面截圖是我所用Flash的信息,不同型號版本的都不一樣,以自己所用Flash的datasheet爲準。
第二種:將軟件燒錄進去通過仿真調試,來看我們讀到的外部Flash的信息。
“ext_flash.c”文件中有一個讀取外部Flash信息的方法“extFlashReadInfo”,我們只需要在這個方法執行完成的地方加個斷點即可,將BIM通過IAR直接燒錄到開發板中並仿真,操作截圖顯示如下:
這樣,我們就讀取到了外部Flash的信息並存儲在infoBuf數組中,看下下面的代碼:
/**
* Verify the flash part.
* @return True when successful.
*/
static bool extFlashVerifyPart(void)
{
if (!extFlashReadInfo())
{
return false;
}
pFlashInfo = flashInfo;
while (pFlashInfo->deviceSize > 0)
{
if (infoBuf[0] == pFlashInfo->manfId && infoBuf[1] == pFlashInfo->devId)
{
break;
}
pFlashInfo++;
}
return pFlashInfo->deviceSize > 0;
}
上面的代碼是將讀取的Flash信息與本身支持的Flash比對,從比對的順序我們可以知道,前面我們讀到的infoBuf數組的第一個元素就是Flash的manfId,而第二個元素就是devId,所以將我們自己查到的Flash信息添加到“flashInfo”數組中即可,參照已有的進行添加就行,然後重新編譯BIM即可。
BLE STACK
將“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar”
目錄下的“simple_peripheral.eww”工程配置文件拉到打開的IAR工作區的左側,打開工程,選擇“cc2650lp_stack”,然後直接編譯工程即可,協議棧部分不需要修改。
Application
1.將“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar”
目錄下的“simple_peripheral.eww”工程配置文件拉到打開的IAR工作區的左側,打開工程,選擇“cc2650lp_app”。
2.點擊IAR左側工作區上面的工程配置顯示的地方,會出現下拉菜單,操作過程截圖顯示如下:
在下拉菜單中選擇“FlashOnly_OAD_ExtFlash”,操作之後顯示截圖如下:
3.修改應用部分的SPI引腳配置,根據你的開發板或者產品板的原理圖,修改軟件工程中SPI引腳的配置,修改的地方位於
“E:\ti\simplelink\ble_sdk_2_02_01_18\src\boards\CC2650_LAUNCHXL”
目錄下的“CC2650_LAUNCHXL.h”文件,操作過程截圖顯示如下:
這個地方注意一點:不要將“Board_SPI0_CSN”定義成“Board_SPI_FLASH_CS”所對應的引腳,如上圖中定義成“PIN_UNASSIGNED”即可。
4.因爲默認支持的外部Flash只有4種,所以如果你所使用的Falsh不在默認支持的範圍內,就需要自己在工程中添加,對於你所使用的Flash的信息在配置BIM的時候已經獲取了,我們直接在App的工程中添加相應信息即可,添加的位置在
“C:\ti\tirtos_cc13xx_cc26xx_2_20_01_08\products\tidrivers_cc13xx_cc26xx_2_20_01_10\packages\ti\mw\extflash”目錄下的“ExtFlash.c”文件中,將前面獲取的Flash的信息添加到該文件的“flashInfo”數組中,格式參照已有的即可。
注意:App中flashInfo數組的數據定義跟BIM中flashInfo數組是不一樣的,雖然不影響使用,但是爲了便於閱讀,最好跟既有的定義保持一致。
5.配置完成之後,編譯即可。
生成BIM+Stack+App的hex文件
打開“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar\app”目錄,會看到“merge.bat”腳本,雙擊該腳本,運行結果顯示如下:
(注意:如果你的電腦上沒有安裝Python,請見Python安裝步驟)
就會在當前目錄的“FlashOnly_OAD_ExtFlash\Exe”目錄下生成三合一的hex文件“simple_peripheral_cc2650lp_all”,截圖顯示如下:
燒錄三合一Hex文件
打開 Flash Programmer 2 工具,選擇我們前面編譯生成的“simple_peripheral_cc2650lp_all”文件,操作過程截圖顯示如下:
OAD off-chip升級
1.打開電腦上的BLE Device Monitor工具,如果你沒有安裝,或者版本過低,可以到TI官網或者從下面鏈接中下載安裝程序:
http://download.csdn.net/detail/zzfenglin/9856357打開之後點擊“Scan”,會看到我們剛燒錄“simple_peripheral_cc2650lp_all”文件的設備信息,截圖顯示如下:
2.點擊“Connect”連接設備,然後點擊左上角的“File”,下拉菜單中選擇“Program(OAD)”,操作過程截圖顯示如下:
點擊之後,會彈出升級模式選擇提示框,截圖顯示如下:
3.點擊“Off-chip OAD”,進入片外OAD升級界面,截圖顯示如下:
4.點擊“Add Flash Image(s)”下方輸入框旁邊的“Browse...”,選擇要升級的App或者App+Stack的hex文件,Image Type類型根據需要選擇,因爲升級文件我選擇的App的hex,所以Image Type我選擇的是“1:Application”,選完之後,“New Flash Image”下面會顯示所選鏡像的信息,點擊“Program”下方的“Start”開始升級,配置及升級過程顯示截圖如下:
5.升級成功之後,需要復位下設備或者斷電重啓,就可以運行我們剛升級的固件了。
升級過程出現的問題
下面羅列一下升級過程中出現的一些問題以及說明:
1.連接設備選擇要升級的固件之後,沒有“Start”按鈕,現象截圖如下:
沒有升級開始的按鈕,這個問題出現在win7的筆記本上,而臺式機上不會出現此問題,目前筆記本上的這個問題暫時沒有找到解決辦法,如果哪位網友知道的話,歡迎留言告訴我,多謝!
感謝網友的分享,目前筆記本上的這個問題可以通過快捷鍵旋轉筆記本屏幕的顯示來暫時解決。相信後期的Ble Device Monitor工具會解決此bug。
2.連接成功點“Start”開始升級的時候,提示“OAD flash error...”,現象截圖如下:
原因分析:從上面截圖的現象,以及前面講過的OAD升級狀態碼,我們可以知道這個錯誤提示的原因是Flash打開失敗,需要排查一下SPI引腳配置或者所用Flash型號是否在軟件工程中配置添加過。