在nordic的sdk中,有豐富的文件和例子介紹nrf51822的ota公升級流程。但也有兩個方面的問題:
1、各部分的內容比較分散,不容易把整體流程串聯起來,而且對一些引數的配置說明也不夠清晰。
2、不論是在nrf51_sdk_7.1.0還是nrf51_sdk_10.0.0中,所有的例項都是以nrf51422_xxac為基礎的。實際工作中還有可能用到nrf51822_xxaa這樣的晶元,怎麼對它們進行配置並不能找到相應的說明。
正是基於以上兩個原因,才有了此文件的產生。本文首先簡單的介紹了ota公升級流程;然後對公升級過程中要用到的各部分配置和使用進行了詳細的說明。需要指出的是:本文是以nrf51_sdk_7.1.0及7.1.0 s110 softdevice為實踐基礎,其它版本的sdk 和 softdevice類似。
進行ota公升級,nrf51晶元上必須具有softdevice, bootloader程式。完成公升級之後,nrf51晶元上也會具有該晶元所真正需要功能的應用程式。接下的內容將會重點說明需要使用ota公升級的應用程式如何配置和編寫必要**,bootloader程式如何配置和更改**等。
在講述本文重點內容之前,需要對nrf51 flash的布局進行乙個簡單的介紹。採用ota的方案中, 256k flash的nrf51晶元有兩種布局方式:
dual bank flash布局
single bank flash布局
sdk中有兩種flash布局的詳細說明,此處不再贅述。僅需說明的是採用兩種不同布局方式的差別:
(1)、single bank布局不支援softdevice及bootloader自身的公升級,只支援該晶元上應用程式的公升級。
(2)、採用single bank布局的方式中,一旦開始公升級,晶元上原有的應用程式將不能被儲存。而以dual bank布局的方式中,在開始接收新的二進位制程式(image)時,原有的二進位制程式(image)將會被保留,如果公升級失敗不會影響晶元上原有的程式。本文的實踐是以dual bank 的方式進行的。
本文實踐中用到的softdevice版本號為:s110_nrf51822_7.1.0。ota公升級時需用到的softdevice與ble用到的softdevice沒有任何區別。唯一需要注意的是softdevice的版本必須與bootloader及應用程式的版本相匹配。
本文實踐中用到的bootloader例程是:dual_bank_ble_s110(位於nrf51_sdk_7.1.0\examples\dfu\bootloader\pca10028\dual_bank_ble_s110\arm目錄)。該例子是以nrf51422_xxac為基礎的,而實踐中用到的板子所用的晶元為nrf51822_xxaa,因此必須做出下面的修改。
因為nrf51422_xxac與nrf51822_xxaa的flash相同,且都採用dual bank的布局方式,因此它們flash的配置是相同的,不必修改。這裡僅需要修改ram(xxac為32k的ram,xxaa為16k的ram)的配置。具體修改如下面兩個圖中的兩個紅色框所示。
nrf51422_xxac中的配置
nrf51822_xxaa中的配置
其中iram2(從0x20003f80開始的256位元組的空間)在bootloader中用於存放公升級過程中軟啟動(soft reset)時需要儲存的資料。
修改bootloader中softdevice的初始化引數,主要是修改softdevice_handler_init巨集定義中的clock_source引數。該引數在不同的板子上會有不同的值,本次實踐中用到的引數值為:nrf_clock_lfclksrc_synth_250_ppm。這個地方需要特別說明的是:普通ble中softdevice_handler_init的use_scheduler引數一般都為false, 而bootloader中該引數的該值應為true,否則ota公升級時會出錯。這兩個引數的具體說明,詳見sdk中的說明。
與3.1中的說明類似,這裡僅需要修改ram的配置(xxac為32k的ram,xxaa為16k的ram)。如下圖所示,將紅色框中的size改為適合晶元大小的ram即可。
需要使用dfu公升級的ble程式都需要新增程式**,增加dfu service。具本分成以下幾步:
(2)、在main.c 中的services_init()函式中新增初始化dfu service的**。新增如下**:
#include "ble_dfu.h"
// initialize the device firmware update service.
memset(&dfus_init, 0, sizeof(dfus_init));
dfus_init.error_handler = null;
dfus_init.revision = dfu_revision;
err_code = ble_dfu_init(&m_dfus, &dfus_init);
**中的reset_prepare函式用於從應用切換到bootloader時要做的準備工作。
(3)、在ble 事件分發函式ble_dfu_on_ble_evt中使用:
ble_dfu_on_ble_evt(&m_dfus, p_ble_evt)
函式,將ble事件分發給dfu service。
做完以上幾步就可以開發出乙個支援dfu的ble應用。但此時公升級的安全性等問題都未考慮。
ota公升級包(zip檔案)的產生在sdk中有說明,但具體流程不是特別清晰。這裡重點介紹了產生zip公升級包所需要的流程和工具,並且以乙個具體例子來進行說明。
主要有兩個工具:
(1)、
(2)、
, master control panel,該工具需要在pc上安裝,用於將bin或hex檔案轉換成zip檔案。
這裡產生的zip公升級包,僅僅包括需要公升級的應用程式,不包括bootloader及softdevice。如果要產生包括這三者的公升級包,見5.1中第乙個工具中的說明(how to generate the init file for dfu.pdf檔案)。產生zip公升級包可使用5.1中第二個工具的中的nrfutil.exe命令:
nrf51822 廣播間隔
1.目的 設定廣播間隔,已達到乙個功耗最佳的狀態 2.分析 廣播間隔,指每次藍芽廣播之間的間隔,間隔越大功耗越低,間隔越小功耗越大 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 在main.c static void adver...
NRF51822和NRF52832的簡單介紹
1 功耗方面 nrf52832更是在nrf51822的基礎上簡直將功耗降低了一半 2 更好的rf體現,主要是發射功率和接納敏感度更好。發射功率,他哥倆適當,都是 4dbm nrf52832的靈敏度是 96dbm,nrf51822的接納靈敏度是 93dbm。3 更強的處理才能,nrf52832的處理器...
nrf51822 修改藍芽名字
1.目的 修改藍芽的名字 2.分析 藍芽名字最長設定為20個位元組,超過20個位元組為無效 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 首先,要知道設定名字的api 在ble gap.h brief set gap devic...