本文記錄的是Nordic的Secure DFU升級(jí)方式,這種升級(jí)方式的流程主要是,先通過藍(lán)牙發(fā)送開始升級(jí)的指令,然后芯片跳轉(zhuǎn)到Bootloader代碼中進(jìn)行升級(jí),需要說明的是,單獨(dú)的Bootloader代碼已經(jīng)是一個(gè)完整的代碼了,具有藍(lán)牙廣播、藍(lán)牙服務(wù)等功能和信息,相當(dāng)于一個(gè)完整的APP代碼。
這種升級(jí)方式有優(yōu)缺點(diǎn):
優(yōu)點(diǎn)是:就算APP代碼由于某些BUG造成設(shè)備運(yùn)行錯(cuò)誤,設(shè)備也不容易變磚,依舊能再次執(zhí)行DFU進(jìn)行升級(jí);
缺點(diǎn)是:在升級(jí)過程中由于執(zhí)行的是Bootloader代碼,此時(shí)設(shè)備是不執(zhí)行APP的,如果升級(jí)的過程需要1分鐘那設(shè)備在這1分鐘都無法正常運(yùn)行,有些設(shè)備要求在升級(jí)的過程依舊能正常使用,那么這種方式就不太合適了,所以這個(gè)需要根據(jù)實(shí)際應(yīng)用選擇。
在使用DFU前,需要先配置好一些環(huán)境,這個(gè)過程需要比較多的工具,這里一一羅列出來:
- gcc-arm-none-eabi編譯環(huán)境
- Git環(huán)境配置及安裝
- Python環(huán)境配置及nrfutil安裝
- nRF Command Line Tools安裝;
- MinGW環(huán)境配置及安裝;
- nRF Connect App;
gcc-arm-none-eabi編譯環(huán)境
GCC安裝的版本最好是SDK路徑下的GCC版本,安裝路徑建議為默認(rèn),這樣就不需要修改文件了,否則需要根據(jù)實(shí)際的安裝路徑和版本修改。



Git環(huán)境配置及安裝
略。
Python環(huán)境配置及nrfutil安裝
略。
提一點(diǎn)是Python是需要配置環(huán)境變量的,如果有兩個(gè)版本就需要配置兩個(gè)版本的環(huán)境變量,哪個(gè)環(huán)境變量排在首位,系統(tǒng)就優(yōu)先采用哪個(gè)版本。

在cmd中使用命令pip install nrfutil安裝“nrfutil”,安裝成功可通過cmd命令查看相關(guān)命令。

nRF Command Line Tools安裝
點(diǎn)擊上面的網(wǎng)站下載完成后,雙擊安裝包,一直同意和下一步,完成安裝。
MinGW環(huán)境配置及安裝
點(diǎn)擊對(duì)應(yīng)的網(wǎng)站下載安裝包,雙擊安裝,可自定義安裝路徑。安裝完成之后會(huì)彈出Package包安裝界面,這里需要選擇下圖的項(xiàng)目。


選擇對(duì)應(yīng)的選項(xiàng)后,點(diǎn)擊下方圖示的選項(xiàng)。


然后按照下圖配置相應(yīng)的環(huán)境變量。

如果配置完成可以通過cmd命令查看到版本,如下圖所示即證明配置成功(若失敗可重啟電腦再嘗試)。

如果輸入指令彈出以下錯(cuò)誤,提示缺少文件,需要重新下載libiconv-2.dll文件,然后復(fù)制到...\MinGW\bin目錄下即可。

Micro-ecc-master lib生成
用文本方式打開下圖路徑所示的文件。

將所有的make改成mingw32-make,這里是因?yàn)槲覀冊(cè)谂渲肕inGW時(shí),順便把make也安裝了。


雙擊bat腳本即會(huì)自動(dòng)從git上克隆micro-ecc文件并不同型號(hào)的lib。

生成public key
在圖示目錄下編寫并執(zhí)行腳本,生成新的“dfu_public_key.c”和“private.pem”
nrfutil keys generate private.pem
nrfutil keys display --key pk --format code private.pem --out_file dfu_public_key.c

生成bootloader
選擇對(duì)應(yīng)需要升級(jí)型號(hào)的bootloader工程,這里以nRF52810為例。打開工程編譯,應(yīng)沒有Error和Warning。

在下圖路徑生成的“nrf52810_xxaa_s112.hex”即為bootloader

打包文件
這邊為了省事,直接做成腳本生成對(duì)應(yīng)的文件。
nrfutil pkg generate --hw-version 52 --sd-req 0x0103 --application-version 1 --application _build\nrf52810_xxaa.hex --key-file ..\..\..\..\..\dfu\private.pem ..\..\..\generate\dfu_package.zip
nrfutil settings generate --family NRF52810 --application _build\nrf52810_xxaa.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 ..\..\..\generate\bootloader_setting.hex
mergehex --merge ..\..\..\..\..\dfu\secure_bootloader\pca10040e_s112_ble\arm5_no_packs\_build\nrf52810_xxaa_s112.hex ..\..\..\generate\bootloader_setting.hex --output ..\..\..\generate\bootloader.hex
mergehex --merge ..\..\..\..\..\..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex _build\nrf52810_xxaa.hex ..\..\..\generate\bootloader.hex --output ..\..\..\generate\app_merge.hex
del ..\..\..\generate\bootloader_setting.hex
del ..\..\..\generate\bootloader.hex
腳本的目錄如下,腳本用的是相對(duì)地址,可以直接在不同工程下新建該文件夾并編寫腳本,如果路徑對(duì)不上可以根據(jù)實(shí)際情況修改腳本中的內(nèi)容。


打開對(duì)應(yīng)工程,在編譯后執(zhí)行該腳本,自動(dòng)生成燒錄文件和DFU文件。

注意:這里的..\是指上一層目錄的意思,是基于keil的工程目錄而言的,即下圖所示目錄。

更詳細(xì)的說明可以查看nRF Util User Guide。
這里腳本中有幾個(gè)需要注意的命令:
- a. --hw-version:硬件版本,如果是52系列設(shè)置為52,51系列設(shè)置為51;
- b. --sd-req:協(xié)議棧(SoftDevice)IDs,應(yīng)輸入使用的協(xié)議棧版本對(duì)應(yīng)的ID,可以通過cmd命令
nrfutil pkg generate --help獲取到對(duì)應(yīng)的ID,如果nrfutil的版本太低,可以通過命令pip install -U nrfutil升級(jí),這樣就可以獲取最新的SoftDevice firmware IDs;

- c. --family:芯片的家族,按照下圖所示填寫即可,也可以通過cmd命令
nrfutil settings generate --help獲??;

- c. --application-version:軟件的版本,可以查看下圖說明;

- d. --bl-settings-version:SDK 15.3.0及以上版本都是2.

升級(jí)
暫略。
可能遇到的問題
- Q:合并文件時(shí)出現(xiàn)如下錯(cuò)誤:
Overlapping segments detected at address 139264.ERROR: The hex files cannot be merged since there are conflicts.
這里可能是因?yàn)锽ootloader的地址與協(xié)議棧/APP的地址沖突了。

如上圖所示,紫色部分是協(xié)議棧的大小,綠色是APP的大小,從圖中看到APP已經(jīng)到0x27597的位置了,如果Bootloader的地址在這其中就會(huì)出現(xiàn)這樣的合并錯(cuò)誤。如下圖所示的Bootloader地址為0x22000,因此0x22000~0x27597地址與APP沖突了,所以提示address 139264(0x22000).ERROR。

A:可以修改Bootloader的IROM1的起始地址,如果修改后超出了Flash的大小那么只能換一個(gè)Flash更大的芯片了。