nrf51822_xxaa OTA升级教程

      在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类似。


1、NORDIC 51 OTA简介

1.1、整体流程    

      NORDIC 51系列的升级流程如下图所示,首先通过云端将需要升级的固件文件下发到手机APP,由手机端APP触发升级流程。

nrf51822_xxaa OTA升级教程_第1张图片

图片来源:https://www.nordicsemi.com/eng/Applications/PC-Peripherals

       OTA手机端使用的APP为nRF Toolbox App,其可从NORDIC的官方网站找到下载链接,对该APP的使用不在本文的介绍之列。本文只对如何生成手机APP需要使用的ZIP文件进行介绍。同时,对于设备(nrf51芯片)需要使用的所有软件的配置也将会作为重点介绍。

       进行OTA升级,nrf51芯片上必须具有softdevice, bootloader程序。完成升级之后,nrf51芯片上也会具有该芯片所真正需要功能的应用程序。接下的内容将会重点说明需要使用OTA升级的应用程序如何配置和编写必要代码,Bootloader程序如何配置和更改代码等。

1.2、Flash空间布局

        在讲述本文重点内容之前,需要对nrf51 flash的布局进行一个简单的介绍。采用OTA的方案中, 256K flash的nrf51芯片有两种布局方式:

  1. Dual Bank Flash布局

    nrf51822_xxaa OTA升级教程_第2张图片

                                         Memory Layout of 256kB nRF51 chip using dual bank memory scheme. 图片来源: Nordic SDK 7.1.0文档

  2. Single Bank Flash布局

          nrf51822_xxaa OTA升级教程_第3张图片

                             Memory Layout of 256kB nRF51 chip using single bank scheme 图片来源: Nordic SDK 7.1.0文档

    SDK中有两种flash布局的详细说明,此处不再赘述。仅需说明的是采用两种不同布局方式的差别:

    (1)、single bank布局不支持softdevice及bootloader自身的升级,只支持该芯片上应用程序的升级。

    (2)、采用single bank布局的方式中,一旦开始升级,芯片上原有的应用程序将不能被保存。而以dual bank布局的方式中,在开始接收新的二进制程序(image)时,原有的二进制程序(image)将会被保留,如果升级失败不会影响芯片上原有的程序。本文的实践是以dual bank 的方式进行的。

2、OTA之softdevice

  本文实践中用到的softdevice版本号为:s110_nrf51822_7.1.0。OTA升级时需用到的softdevice与BLE用到的softdevice没有任何区别。唯一需要注意的是softdevice的版本必须与bootloader及应用程序的版本相匹配。

3、OTA之bootloader

  本文实践中用到的bootloader例程是:dual_bank_ble_s110(位于nRF51_SDK_7.1.0\examples\dfu\bootloader\pca10028\dual_bank_ble_s110\arm目录)。该例子是以nrf51422_xxac为基础的,而实践中用到的板子所用的芯片为nrf51822_xxaa,因此必须做出下面的修改。

3.1、修改内存配置

  因为nrf51422_xxac与nrf51822_xxaa的flash相同,且都采用dual bank的布局方式,因此它们flash的配置是相同的,不必修改。这里仅需要修改RAM(xxac为32k的RAM,xxaa为16K的RAM)的配置。具体修改如下面两个图中的两个红色框所示。

nrf51822_xxaa OTA升级教程_第4张图片

nrf51422_xxac中的配置

 

nrf51822_xxaa OTA升级教程_第5张图片

nrf51822_xxaa中的配置

  其中IRAM2(从0x20003f80开始的256字节的空间)在bootloader中用于存放升级过程中软启动(soft reset)时需要保存的数据。

3.2、修改bootloader中softdevice初始化参数

  修改bootloader中softdevice的初始化参数,主要是修改SOFTDEVICE_HANDLER_INIT宏定义中的CLOCK_SOURCE参数。该参数在不同的板子上会有不同的值,本次实践中用到的参数值为:NRF_CLOCK_LFCLKSRC_SYNTH_250_PPM。这个地方需要特别说明的是:普通BLE中SOFTDEVICE_HANDLER_INIT的USE_SCHEDULER参数一般都为false, 而bootloader中该参数的该值应为true,否则OTA升级时会出错。这两个参数的具体说明,详见SDK中的说明。

4、OTA之应用程序

  本文实践中用到的应用程序是:ble_app_hrs(位于nRF51_SDK_7.1.0\examples\ble_peripheral\ble_app_hrs\pca10028\experimental_s110_with_dfu\arm目录)。该例子是以nrf51422_xxac为基础的,要在nrf51822_xxaa中使用,必须进行参数修改。

4.1修改内存配置

  与3.1中的说明类似,这里仅需要修改RAM的配置(xxac为32k的RAM,xxaa为16K的RAM)。如下图所示,将红色框中的size改为适合芯片大小的RAM即可。

nrf51822_xxaa OTA升级教程_第6张图片

 

4.2、修改应用程序

   需要使用DFU升级的BLE程序都需要添加程序代码,增加DFU Service。具本分成以下几步:

   (1)、将bootloader_util_arm.c,dfu_app_handler.c,ble_dfu.c三个文件添加到自己的工程中。这个三个文件的位置见SDK的说明。需要指出的是,除了这个三个文件,还应把这三个文件使用的头文件包括进工程,并将路径在Keil中配置好。如下图所示:

nrf51822_xxaa OTA升级教程_第7张图片

 

   (2)、在main.c 中的services_init()函数中添加初始化DFU service的代码。添加如下代码:

    #include "ble_dfu.h"

    #include "dfu_app_handler.h"


                    ble_dfu_init_t dfus_init;

                   // Initialize the Device Firmware Update Service.

                   memset(&dfus_init, 0, sizeof(dfus_init));

                   dfus_init.evt_handler = dfu_app_on_dfu_evt;

                   dfus_init.error_handler = NULL;

                   dfus_init.revision = DFU_REVISION;

                   err_code = ble_dfu_init(&m_dfus, &dfus_init);

                   APP_ERROR_CHECK(err_code);

                   dfu_app_reset_prepare_set(reset_prepare);

    代码中的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应用。但此时升级的安全性等问题都未考虑。

5、OTA之升级ZIP包的产生

  OTA升级包(ZIP文件)的产生在SDK中有说明,但具体流程不是特别清晰。这里重点介绍了产生ZIP升级包所需要的流程和工具,并且以一个具体例子来进行说明。

5.1、所需要使用的工具

   主要有两个工具:

   (1)、https://github.com/NordicSemiconductor/nRF-Master-Control-Panel,该工具包可直接下载,里面包括了产生ZIP升级包的说明以及将hex文件转变成bin文件的工具等。

   (2)、https://www.nordicsemi.com/eng/nordic/Products/nRF51-Dongle/nRF-MCP-x64/38908, Master Control Panel,该工具需要在PC上安装,用于将bin或hex文件转换成zip文件。

5.2、ZIP升级包产生示例

  这里产生的ZIP升级包,仅仅包括需要升级的应用程序,不包括Bootloader及Softdevice。如果要产生包括这三者的升级包,见5.1中第一个工具中的说明(How to generate the INIT file for DFU.pdf文件)。产生ZIP升级包可使用5.1中第二个工具的中的nrfutil.exe命令:

  示例:nrfutil.exe dfu genpkg --application nrf51822_xxaa_hrs_s110.hex --application-version 0xFFFFFFFF --dev-revision 0xFFFF --dev-type 0xFFFF --sd-req 0x005A nrf51822_xxaa_app.zip

  会产生仅支持S110 v7.1.0 的nrf51822_xxaa_app.zip,该ZIP文件仅包括待升级的应用程序。以上各参数的说明可以在How to generate the INIT file for DFU.pdf文档中找到解释。

你可能感兴趣的:(BLE)