CC2640之OAD固件升級(內置Flash)

什麼是OAD


OAD是TI在BLE協議棧基礎上擴展的一種無線更新技術。OAD使用客戶端-服務器的機制工作。需要固件更新的目標芯片叫做OAD Target/Client,用來管理OAD功能的一端叫做OAD Manager/Server。

 

配置OAD的目標設備,如果需要更新軟件的話,不用連接仿真器,通過BLE無線就可以更新軟件,方便用戶升級。

 

有些人會覺得OAD很複雜,其實並不複雜,本質就是OAD Manager/Server端將需要升級的bin文件字節流取出來,然後按照特定的長度(因爲BLE每個包的長度是受限的)通過write方法,將數據通過帶有寫權限的特徵值發送給OAD Target/Client端,然後OAD Target/Client 端將收到的數據寫到特定的flash地址上。

 

CC2640的OAD固件升級支持內置Flash和外置Flash兩種,我們先來了解下內置Flash的OAD配置方式,至於外置Flash的情況,後期再繼續更新。




CC2640內置Flash OAD


內置Flash的OAD固件升級配置之後,整個Flash中地址分配情況如下圖:



下面,我們來具體瞭解一下內置Flash的設備配置OAD的方法。




編譯ImageA


ImageA在官方文檔中是指OAD Target Application,因爲CC2640的工程燒錄的時候是將BIM、BLE STACK和OAD Target Application這三者hex文件合併成OAD_merge.hex文件,所以我們在下面的介紹文檔中用ImageA來統稱這三者合併之後的OAD_merge.hex文件,希望大家不要混淆了,這裏這樣統稱,只是爲了方便下述流程的說明

 

下面,我們一起來看看編譯的方法和編譯過程中出現的問題及解決辦法:

1.先打開IAR開發工具,然後將

C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR

目錄下的OADTarget.eww拖到IAR的左側工作區,打開OADTarget工程,打開之後顯示如下:



我們可以看到,打開的工程包含了BIM、CC2640App和CC2640Stack,編譯過程爲:首先編譯BIM,然後編譯CC2640Stack,最後編譯CC2640App,編譯CC2640App的時候會在編譯完成的時候調用Python執行hexmerge.py腳本來將編譯生成的三個hex文件合併成一個。

 

2.BIM和CC2640Stack的編譯沒有什麼問題,我們不再講述,下面重點來看一下CC2640App編譯之後執行合成腳本的時候出現的問題,沒有進行任何配置的情況下,會提示下面截圖的信息:



這個錯誤是因爲沒有安裝Python或者你安裝的目錄不是C:\Python27\”下,導致找不到該執行文件,Python的安裝過程可以參考下面鏈接中的博文:


點擊打開Python安裝配置博文鏈接


Python安裝完成並配置環境變量之後,我們還需要下載合成腳本,並複製到Python的安裝目錄下,合成腳本hexmerge.py的下載鏈接如下:


https://launchpad.net/intelhex/+download


打開上述下載鏈接之後截圖如下:



上面鏈接中列出了很多不同時期的版本,我下載的是上述截圖中的紅圈圈中的這個,下載到電腦上之後,解壓縮顯示如下:



我們需要的腳本在解壓出來的文件夾的scripts目錄下,將該目錄下的所有py腳本都複製到C:\Python27\Scripts目錄下。

 

3.重新編譯CC2640App,但是這個時候又會出現下面的編譯錯誤:



從上面截圖中的編譯錯誤提示,我們看不出什麼原因,這個時候,我們可以將錯誤提示中的那些命令複製出來,刪掉換行符和不必要的空格,剩下的內容如下:

python "C:\Python27\Scripts\hexmerge.py" -o "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\FlashROM\Exe\OAD_merge.hex" -r "0000:1FFFF" --overlap=error "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\FlashROM\Exe\OADTargetApp.hex":0100:1FFFF "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\..\..\..\..\..\util\BIM\CC26xx\FlashOnly\Exe\BIM.hex":0000:1F5FF "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\..\..\Stack\CC2640\FlashROM\Exe\OADTargetStackFlashROM.hex":F000:1EFFF 

這其實就是合併文件的命令,而且是絕對路徑的,那我們就可以在windows命令行中運行一下看看是否會提示更詳細的錯誤信息,運行結果截圖如下:



果然,不出所料的有更詳細的提示信息,提示錯誤是導入intelhex模塊的時候發現沒有該模塊,當然,我們也可以打開hexmerge.py腳本,然後看看錯誤提示中提到的139行的內容,來了解具體執行的地方,截圖如下:



解決辦法:將下載解壓的intelhex-2.1文件夾下的intelhex文件夾整個複製到C:\Python27目錄下,然後重新編譯,這樣就可以成功編譯了,編譯成功之後會在

C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\

CC2640\FlashROM\Exe

目錄下生成OAD_merge.hex文件,這就是我們需要的ImageA的hex文件。

 

注意:用這個ImageA升級ImageB的話,如果用PC端的BLE Device Monitor或者安卓手機端的APP都會出現連接失敗,或者搜索不到服務,或者搜索到服務之後過一會就斷開,或者升級過程中斷開連接等問題,這個問題的主要原因是ImageA的CC2640App開啓了BLE連接成功之後自動申請修改連接參數的功能,在

C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\Source\Application目錄下的oadTargetApp.c文件中,相關代碼截圖如下:



自動申請的連接參數最小是80,最大是800,這個連接間隔太長,會影響升級,所以我們將DEFAULT_ENABLE_UPDATE_REQUEST的值改爲FALSE來關閉自動申請連接參數更新,進而用默認的連接參數進行升級。這樣PC端的BLE Device Monitor才能正常連接並進行升級。如果爲了提高升級的速度,需要將連接間隔縮小,那用PC端的BLE Device Monitor的話可以用該工具進行設置;若用手機端進行升級的話,可以將需要的連接間隔通過某個特徵值發給從機,由從機來重新申請。




燒錄ImageA


將開發板通過XDS仿真器鏈接到電腦上,連接的方法、Flash Programmer工具以及驅動的安裝我們這裏不再講述,準備好之後,打開Flash Programmer 工具,然後按照下圖進行操作:



成功燒錄之後,我們用PC端的BLE Device Monitor工具進行搜索和連接,之後可以看到相應的服務和特徵值,截圖如下:


此處有一點需要注意,就是ImageA中固定了Mac地址,也就是,如果用協議棧中的Demo編譯ImageA,其Mac地址都是0A:D0:AD:0A:D0:AD,而後面編譯的ImageB用的是芯片本身的Mac地址,這樣可以避免用安卓手機等方式升級時,因爲藍牙緩存的原因導致設備名、服務和特性沒有改變的問題。

 

當然ImageA的Mac地址也可以根據自己的需求進行修改,但是要保證跟現有的已經分配的Mac地址不衝突,所以除非必須改,否則不要動這個地方。代碼中設置的地方截圖如下:





編譯ImageB


我們先用TI協議棧中的Demo進行測試和整個流程的熟悉。如何在一個沒有配置過OAD的工程中配置OAD ImageB的相關內容在另一篇博文中講解,鏈接如下所示:


點擊打開手動配置ImageB的博文

 

1.打開協議棧中的SimpleBLEPeripheral工程,CC2640App選擇FlashOnly_OAD_ImgB,截圖如下:



2.首先編譯CC2640Stack,然後編譯CC2640App,成功編譯之後,會在
C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\IAR\Application\

CC2640\FlashOnly_OAD_ImgB\Exe

目錄下生成OADbin.bin文件,這個就是ImageB的bin文件。


3.用PC端的BLE Device Monitor工具或者安卓手機端工具將該文件更新到設備端之後,會發現設備端重啓之後不再廣播,程序跑不起來,如果出現這種情況,打開

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;


操作截圖如下:


至於這個地方爲什麼要這樣,TI官方文檔其實有說明。官方文檔中的說明如下:





升級ImageB


ImageB用PC端BLE Device Monitor工具升級過程如下:

1.用BLE Device Monitor工具,搜索並連接我們要升級的設備,然後點擊菜單欄上的File”,在下拉菜單中選擇Program(OAD),操作截圖如下:



2.點擊Program(OAD)之後,會彈出如下所示的框框:



File Image裏面要選擇的文件就是我們要更新的固件,我的是在

C:/ti/simplelink/ble_cc26xx_2_01_00_44423/Projects/ble/SimpleBLEPeripheral/CC26xx/IAR/Application/

CC2640/FlashOnly_OAD_ImgB/Exe/OADbin.bin目錄下的該文件,選擇之後,點擊Start進行升級,升級過程如下:



待進度條走完,升級就完成了,該提示框會自動消隱。

 

3.升級完成之後,然後重新用PC端的BLE Device Monitor工具進行搜索和連接(如果搜索不到,就重啓下設備然後再試試),截圖如下:



ImageB的設備名我特意進行了修改,目的是與ImageA的進行區分,並且看右側跟之前ImageA的相比較也明顯能看出服務和特性都不一樣了,證明我們的升級成功了。

 

4.到了這一步,ImageB的固件就升級到我們的目標設備上了,但是ImageB本身不帶升級功能,所以沒有辦法來升級ImageA,有人會問,那我們要更新ImageB怎麼辦呢?也就是我們如何從ImageB切換到ImageA,然後重新升級新的固件ImageB呢?

 

TI考慮到了這一點,所以增加了一個UUID爲FFD0的服務和UUID爲FFD1的特徵值,用戶可以向該特徵值寫入任意值,設備端就會切換回ImageA,截圖如下:



重新搜索設備,就會發現設備切換到ImageA了。

因爲本人是個愛學習的小學生,所以我們再一起來看看上述切換的實現代碼及原理,實現代碼在

C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\Profiles\OAD\CC26xx

目錄下的oadResetService.c文件中,源碼截圖如下:



關鍵的部分就是紅圈裏面的內容,源碼如下:

uint16_t crc[2] = {0x0000, 0x0000};

// Invalidate the image.
OADTarget_writeFlash(OAD_IMG_R_PAGE, OAD_IMG_R_OSET + OAD_IMG_CRC_OSET,
		(uint8_t *)crc, 4);

// Reset.
HAL_SYSTEM_RESET();

從上述代碼中不難看出,所謂的ImageB切換回ImageA,其實就是將Flash中ImageB校驗字節寫成0,因爲重啓設備的時候運行到BIM中會先去判斷ImageB的校驗字節,如果全爲0,就認爲ImageB不完整或者沒有,然後去判斷ImageA的校驗字節,如果ImageA的校驗字節完整非0,就去運行ImageA。有的人覺得爲了這個功能單獨配置一個服務和特徵值太浪費了,那我們可以將這個服務和特徵值刪掉,然後在你必須要保留的特徵值中找一個帶有寫權限的,然後在主機通過該特徵值寫入某個命令的時候執行上述代碼即可。


到這裏,CC2640 OAD的整個過程就瞭解完了。




TI官方OAD文檔


TI官方OAD文檔在安裝的協議棧中,在

C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Documents目錄下的CC2640 BLE OAD User's Guide.pdf文檔中。






發佈了66 篇原創文章 · 獲贊 207 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章