NORDIC BLE升級


NRF52832 SDK15.3.0

概述:

所謂DFU(Device Firmware Update),就是設備固件升級的意思,而OTA是DFU的一種類型,准確說,OTA的全稱應該是OTA DFU,只不過大家為了方便起見,直接用OTA來指代固件空中升級(有時候大家也將OTA稱為FOTA)。DFU除了可以通過無線方式(OTA)進行升級,也可以通過有線方式進行升級,比如通過UART,USB或者SPI通信接口來升級設備固件。

不管采用OTA方式還是有線通信方式,DFU包括后台式(background)和非后台式兩種模式,目前的智能手機升級Android或者iOS系統都是采用background DFU方式,即新固件在后台悄悄下載,下載成功后,再提示用戶升級,整個升級過程中對用戶手機使用沒有任何影響。而早先的功能機就是采用非后台式 DFU來升級操作系統的,即用戶需要先長按某些按鍵進入bootloader模式,然后再進行升級,在升級過程中,手機的正常功能無法使用。Background DFU必須采用雙備份(dual bank)模式進行升級,即老系統(老固件)和新系統(新固件)各占一塊存儲區,只有當新系統下載完成並校驗成功后才會去升級老系統。而非后台式DFU可以采用dual bank或者single bank模式,dual bank的做法是升級時系統先進入bootloader,然后把新系統(新固件)下載下來並校驗成功,然后再擦除老系統(老固件)並升級新系統,dual bank方式雖然犧牲了很多存儲空間,但是換來了更好的升級體驗。Single bank的做法是升級時系統也是先進入bootloader,然后立馬把老系統擦除,然后直接把新系統下載到老系統區域,跟dual bank相比,single bank將大大節省Flash存儲區域,在系統資源比較緊張的時候,推薦使用single bank方式。不管是single bank還是dual bank,升級過程出現問題后,都可以進行二次升級,都不會出現“變磚”情況。不過dual bank有一個好處,如果升級過程中出現問題或者新固件有問題,它還可以選擇之前的老系統繼續執行而不受其影響。而single bank碰到這種情況就只能一直待在bootloader中,然后等待二次或者多次升級,此時設備的正常功能就無法使用了,從用戶使用這個角度來說,你也可以認為此時設備已經“變磚”了。可參考下面三個圖來理解上述過程

 

 SDK軟件架構

Nordic nRF5系列產品都是使用Flash存儲器的,確切說,是嵌入式可執行代碼的Flash存儲器,也就是說,代碼是可以直接在上面運行的,這個跟很多其他BLE廠商是不一樣的(他們使用的是nand Flash,代碼是不能直接在nand Flash中運行的,必須先裝載到RAM中才能跑,所以你會發現這些廠商的RAM都非常大)。Nordic Flash是帶cache機制的,以保證大部分代碼執行速度可以達到64MHz,在cache失敗的時候,等待周期也只有1個cycle,可以說Flash的執行速度和效率都是非常不錯的。另外,Nordic芯片是純Flash產品,里面沒有其他NVM,所有非易失性數據都放在Flash中,包括藍牙協議棧,這也是為什么Nordic藍牙協議棧也可以OTA的根本原因所在。

Nordic nRF5 SDK將芯片的存儲器划分成如下格局:

      Flash結構圖                                                                                              RAM結構圖

nrf52832flash分區:

Nordic OTA分dual bank和single bank,application、協議棧、和bootloader都可以升級

dual bank updates:

 single bank updates:

 

 MBR了解:如果bootloader存在的話,Master Boot Record(MBR)的作用是為了啟動bootloader

從上圖可知,Flash存儲器最下面放的是softdevice(softdevice就是藍牙協議棧,圖中的MBR也屬於softdevice的一部分),中間是application,最上面是bootloader(可選,只有需要OTA的時候,才需要下載bootloader)。這里需要特別指出的是,softdevice是以二進制形式提供給大家的,它占據了Flash的一塊固定空間,起始地址為0,結束地址為APP_CODE_BASE。softdevice同時占用了RAM的一塊固定空間,起始地址為0x20000000,結束地址為APP_RAM_BASE。Softdevice占用的Flash空間是固定不變的,運行時不可調節,也就是說APP_CODE_BASE是一個固定值,而softdevice占用的RAM空間是動態可調的,跟softdevice配置和藍牙服務的多少有直接關聯,所以APP_RAM_BASE一定要根據應用的實際情況進行調整。

這里說明一下, Softdevice不是以庫的形式提供給大家,而是以二進制文件(hex文件)的形式提供給大家,這種方式可以帶來很多好處。首先二進制形式可以保證藍牙BQB認證的版本和發布給客戶的版本一模一樣(因為庫形式的版本每次編譯都會產生少許差異!)。其次softdevice不需要跟你的應用一起編譯或者鏈接,大大節省調試時間,更主要的是,Softdevice運行在固定的Flash空間中,使用固定的RAM空間,從而與你的應用完全隔離開,實現了真正的模塊分離,從而出現問題時,可以迅速定位是協議棧的問題還是應用的問題。再次二進制形式的 Softdevice開啟了保護機制,應用代碼是不能對其進行訪問的,以保證Softdevice的安全性,防止應用代碼誤訪問或者誤擦除某些softdevice區域。最后這種多bin形式使得OTA變得非常靈活,你可以只OTA應用,也可以OTA協議棧和bootloader,或者三者同時OTA。

安裝環境:

1、gcc-arm-none-eabi編譯環境:GCC編譯環境( https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads

升級需要micro_ecc_lib_nrf52.lib,需要使用GCC編譯器生成

2、MinGW平台(https://sourceforge.net/projects/mingw/files/latest/download?source

用於編譯makefile文件,產生micro_ecc_lib_nrf52.lib

3、python(https://www.python.org/downloads/

選擇版本在2.7.6~3.0.0之間的版本,用於安裝nrfutil工具,nrfutil工具用於產生私匙、公匙以及升級需要的settings信息

4、nrfgo-studio(www.nordicsemi.com)

安裝后主要使用"nrfjprog.exe"和"mergehex.exe",用於合並與下載文件

5、nrf connect app

用於手機端藍牙APP

安裝說明:

1、gcc-arm-none-eabi編譯環境

 

 2、mingw 平台安裝

 安裝好后彈出package包安裝界面MinGW Installation Manager,按下圖所示進行選擇

 選擇后,點擊Installationa Apply Changes

3、python安裝,nrfutil安裝

雙擊python-2.7.14.amd64.msi安裝,注意使用默認路徑,安裝過程使用默認插件配置直接一直next

添加環境變量:

 

 打開Windows命令行工具CMD,輸入如下命令:pip install nrfutil,等待完成nrfutil的安裝。安裝后nrfutil.exe在C:\Python27\Scripts中

安裝完成后,在Windows命令行工具輸入:nrfutil version,其版本應該在3.2.0以上

對於Windows用戶,nrfutil運行需要幾個特殊的DLL庫,而這幾個庫有些Windows機器是沒有的,如此,可往:https://www.microsoft.com/en-us/download/details.aspx?id=40784下載

生成公匙、私匙對

nrfutil keys generate C:\Users\·\Desktop\priv.pem 產生私匙

nrfutil keys display --key pk --format code C:\Users\·\Desktop\priv.pem --out_file  C:\Users\·\Desktop\dfu_public_key.c 產生公匙

生成的 dfu_public_key.c 文件會拷貝到 dfu 文件夾下供 secure_bootloader 使用 

 

生成micro_ecc_lib_nrf52.lib

執行如下的“build_all.bat”腳本(Windows系統),以生成相應的micro-ecc庫(micro-ecc會用來對簽名進行驗簽等安全功能)。請注意,欲成功執行build_all.bat,大家必須先安裝好git和gcc編譯器

點擊后會自動從github上下載micro-ecc

打開MinGW的命令行msys.bat

在批處理框里輸入要生成庫的gcc算法路徑

cd F:\nRF5_SDK_15.3.0_59ac345\external\micro-ecc\nrf52hf_keil\armgcc

之后輸入make

 出現錯誤后,按照提示修改gcc的Makefile.windows文件如下(根據下載的gcc-arm-none-eabi編譯環境安裝路徑以及版本修改)

 

 再次輸入make:

 

 

 至此micro_ecc_lib_nrf52.lib庫生成完成

升級包制作:

升級共需要3個文件以及一個私匙

應用程序文件nrf52832_xxaa_app.hex(F:\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs)

boot程序文件nrf52832_xxaa_bootloader_s132.hex(F:\nRF5_SDK_15.3.0_59ac345\examples\dfu\secure_bootloader\pca10040_ble\arm5_no_packs)

藍牙協議棧s132_nrf52_6.1.1_softdevice.hex(F:\nRF5_SDK_15.3.0_59ac345\components\softdevice\s132\hex)

私鑰priv.pem

打開命令行工具,輸入:

 生成settings

nrfutil settings generate --family NRF52 --application nrf52832_xxaa_app.hex --application-version 1 --bootloader-version 2 --bl-settings-version 1 settings.hex

合並boot與settings

mergehex.exe --merge nrf52832_xxaa_bootloader_s132.hex settings.hex --output bl_temp.hex

合並bootloader, app and softdevice

 mergehex.exe --merge bl_temp.hex nrf52832_xxaa_app.hex s132_nrf52_6.1.1_softdevice.hex --output whole.hex

最終產生whole.hex就是制作的升級程序,將whole.hex下載到設備中就能升級了

升級

生成ZIP文件,需要用戶程序nrf52832_xxaa_new_app.hex以及私匙priv.pem

輸入nrfutil.exe pkg generate --application nrf52832_xxaa_new_app.hex --application-version 2 --hw-version 52 --sd-req 0xB7 --key-file priv.pem SDK14_app_s132.zip

產生的ZIP文件為SDK14_app_s132.zip

 打開nRF Connect掃描連接Nordic_Buttonless升級用戶程序:

 點擊圓圈處

 發送請求,設備將復位並進入bootloader狀態

 發送完以后,可以看到名為DFUTARG的設備,說明此時設備進入bootloader 狀態。連接藍牙DfuTarg設備

點擊右上角的DFU按鈕,選擇zip文件,開始升級

 

 等待升級完成

文章參考自:

https://www.cnblogs.com/silencehuan/p/11011716.html

https://blog.csdn.net/jdsnpgxj/article/details/80772727

https://www.cnblogs.com/iini/p/9314246.html

https://blog.csdn.net/seanblog/article/details/100011194

 https://blog.csdn.net/weixin_40204595/article/details/80669501


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM