nrf51822 xxaa OTA公升級教程

2021-07-11 22:11:18 字數 3526 閱讀 9827

在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"

ble_dfu_init_t dfus_init;

// 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...