天天看點

使用Nordic的nrf52840實作藍牙DFU過程

需要用到的軟體:

交叉編譯環境:gcc-arm-none-eabi

MinGW:下載下傳

Python:下載下傳

micro-ecc源碼:下載下傳

nRFUtil:下載下傳或者直接使用python的pip來安裝

手機app:nRF Toolbox或者nRF Connect

安裝

gcc-arm-none-eabi安裝

gcc-arm-none-eabi按照預設配置直接安裝,在完成頁面選擇添加至環境變量。

使用Nordic的nrf52840實作藍牙DFU過程

MinGW安裝

MinGW按照預設配置安裝,到Installation Manager界面選擇如下三個package:

使用Nordic的nrf52840實作藍牙DFU過程

點選左上角Installation→Apply Changes後點Apply。安裝完成後将路徑C:\MinGW\bin添加至環境變量。安裝成功後在指令行輸入gcc -v可以檢視是否安裝成功。

使用Nordic的nrf52840實作藍牙DFU過程

micro-ecc拷貝

将下載下傳的micro-ecc-master壓縮包解壓後重命名為micro-ecc,然後拷貝到nRF5_SDK_17.1.0_ddde560\external\micro-ecc路徑下。

使用Nordic的nrf52840實作藍牙DFU過程

Python安裝

如果安裝有多個版本的Python,可以參考使用Nordic的nRF52840 Dongle配合Wireshark對藍牙裝置抓包(BLE)安裝。

nRFUtil安裝

安裝了Python後,可以直接在指令行輸入pip install nrfutil進行安裝。

使用Nordic的nrf52840實作藍牙DFU過程

可以在指令行輸入nrfutil --help檢視是否安裝成功,下面的Commands就是支援的指令。

使用Nordic的nrf52840實作藍牙DFU過程

生成micro_ecc_lib_nrf52.lib

打開C:\MinGW\msys\1.0路徑下的批處理檔案msys.bat,輸入cd /E/nRF5_SDK_17.1.0_ddde560/nRF5_SDK_17.1.0_ddde560/external/micro-ecc/nrf52nf_keil/armgcc後回車(注意路徑中用/,不是\),然後輸入make會有如下提示:

使用Nordic的nrf52840實作藍牙DFU過程

按照紅框中的提示,在相應路徑下用記事本打開,改成自己電腦中的路徑(注意路徑中用/,不是\):

使用Nordic的nrf52840實作藍牙DFU過程

之後輸入make,成功生成lib檔案

使用Nordic的nrf52840實作藍牙DFU過程

生成公私密鑰

用到的指令幫助,可以檢視具體的參數:

nrfutil keys generate --help

nrfutil keys display --help

建立一個檔案夾,命名為key,在指令行切換路徑到建立的檔案夾,輸入nrfutil keys generate private.pem,生成私鑰,每次更新的時候需要用私鑰對image進行驗簽。

使用Nordic的nrf52840實作藍牙DFU過程
使用Nordic的nrf52840實作藍牙DFU過程

然後使用私鑰生成公鑰.c檔案,輸入nrfutil keys display --key pk --format code private.pem --out_file dfu_public_key.c後,會在檔案夾下生成公鑰的.c檔案。

使用Nordic的nrf52840實作藍牙DFU過程

用生成的公鑰檔案替換E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\examples\dfu路徑下的dfu_public_key.c。

使用Nordic的nrf52840實作藍牙DFU過程

Boot和App的HEX檔案生成

Boot檔案使用E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\examples\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs下的keil工程,編譯後生成nrf52840_xxaa_s140.hex,複制到key檔案夾中,并重命名為Bootloader.hex。

App檔案使用E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs下的keil工程,将生成的HEX檔案名稱改為ApplicationA。

使用Nordic的nrf52840實作藍牙DFU過程

在main函數中新增log輸出NRF_LOG_INFO(“My App - A.”);編譯。然後将HEX檔案名稱改為ApplicationB,main函數中log輸出改為NRF_LOG_INFO(“My App - B.”);編譯,将生成的兩個HEX檔案複制到key檔案夾中。

使用Nordic的nrf52840實作藍牙DFU過程

DFU包生成

用到的指令幫助,可以檢視具體的參數:

nrfutil pkg generate --help

在指令行切換路徑到key檔案夾,輸入nrfutil pkg generate --hw-version 52 --sd-req 0x100 --application-version 2 --application

ApplicationB.hex --key-file private.pem app_dfu_package.zip

之後會在key檔案夾中生成一個壓縮包,這個包就是更新包。

使用Nordic的nrf52840實作藍牙DFU過程

其中–sd-req這個字段可以通過E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\components\softdevice\s140\hex路徑下的hex檔案名稱确定型号後比對nrfutil pkg generate --help指令執行後的ID清單。

使用Nordic的nrf52840實作藍牙DFU過程

使用nRF Connect for Desktop下載下傳協定棧的時候打開hex檔案會直接顯示ID。

使用Nordic的nrf52840實作藍牙DFU過程

Bootloader Settings檔案生成

用到的指令幫助,可以檢視具體的參數:

nrfutil settings generate --help

如果直接把協定棧、Bootloader和ApplicationA檔案下載下傳進去後,會發現廣播名稱一直是DfuTarg,一直卡在Bootloader裡面處于DFU模式,沒有進入ApplicationA。這是因為在進入app程式之前boot需要基于Bootloader Settings中的資訊對app程式進行完整性檢查。在沒有app、app完整性校驗失敗或者沒有Bootloader Settings的情況下,boot會進入DFU模式。

使用Nordic的nrf52840實作藍牙DFU過程

這個時候就需要Bootloader Settings來設定一下相關的資訊,使得首次程式下載下傳進去之後直接從Boot轉入App運作。Bootloader Settings包含的資訊如下:

使用Nordic的nrf52840實作藍牙DFU過程

在指令行切換路徑到key檔案夾,輸入nrfutil settings generate --family NRF52840 --application ApplicationA.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 settings.hex,生成Bootloader Settings檔案。

使用Nordic的nrf52840實作藍牙DFU過程

其中–family參數設定如下:

使用Nordic的nrf52840實作藍牙DFU過程

–bl-settings-version參數設定如下:

使用Nordic的nrf52840實作藍牙DFU過程

如果SDK的版本大于等于15.3.0,–bl-settings-version要設定為版本2,如果設定為版本1的話,BootLoader會在引導之前轉換為版本2。

HEX檔案合成

用到的指令幫助,可以檢視具體的參數:

mergehex --h

實際下載下傳時需要4個hex檔案,分别為協定棧、boot settings、boot和app。為了友善燒錄,可以把4個檔案合成一個hex檔案,使用到的工具為nRF Command Line Tools,指令為 mergehex,一次最多可以合成3個hex檔案,是以需要兩步來完成。

使用Nordic的nrf52840實作藍牙DFU過程

此處以nrf52832為例,找到對應的協定棧hex檔案(路徑:nRF5_SDK_17.1.0_ddde560\components\softdevice\s132\hex)複制到key檔案夾中。在指令行切換路徑到key檔案夾,輸入mergehex -m s132_nrf52_7.2.0_softdevice.hex bootloader.hex application.hex -o output_file.hex,其中s132_nrf52_7.2.0_softdevice.hex為協定棧檔案,bootloader.hex application.hex分别為boot和app檔案,這個時候會在key檔案夾中生成三合一的hex檔案output_file.hex。然後把Bootloader Settings檔案合并進去,輸入mergehex -m output_file.hex settings.hex -o output_file_finally.hex,這個output_file_finally.hex就是最終要下載下傳進去的hex檔案。

使用Nordic的nrf52840實作藍牙DFU過程

DFU測試

程式下載下傳進去之後,通過序列槽的log可以看到上電後直接運作了ApplicationA程式。

使用Nordic的nrf52840實作藍牙DFU過程

進入DFU模式的方法:

使用Nordic的nrf52840實作藍牙DFU過程

ble_app_buttonless_dfu例程,使用手機上的nRF Connect可以搜到Nordic_Buttonless的藍牙,連接配接上之後可以看到有一個UUID為0xFE59的服務,服務特征值為0x0003。

使用Nordic的nrf52840實作藍牙DFU過程
使用Nordic的nrf52840實作藍牙DFU過程
使用Nordic的nrf52840實作藍牙DFU過程

然後先使能訓示,再寫入資料,之後藍牙會自動斷開連接配接,進入DFU模式,序列槽log如下。

使用Nordic的nrf52840實作藍牙DFU過程

然後就可以搜到一個DfuTarg的裝置,連接配接上之後選擇DFU,選擇要更新的DFU包,然後點選start進行更新

使用Nordic的nrf52840實作藍牙DFU過程

更新完成後,序列槽log顯示運作了ApplicationB程式。重新搜尋藍牙,又可以搜到名稱為Nordic_Buttonless的藍牙。

使用Nordic的nrf52840實作藍牙DFU過程

使用nRF Toolbox的DFU元件一樣是先標明更新包,然後點Update更新。

使用Nordic的nrf52840實作藍牙DFU過程