nRF52832——无线DFU的原理与步骤(基于SDK15.2)

【背景】
在设计产品时,没有人能保证产品一次成型后代码万年不动,若发现代码bug或有性能优化升级的时候,倘若设备不具备在线升级的功能,那么采取将产品召回的方式进行升级维护会是一笔巨大的开销,所以在本次开发中,将无线升级功能作为一项关键产品特性,利用Nordic  nRF52832 的DFU 很好实现了该功能。


【DFU原理】
1、单片机实现DFU功能:主要是依靠bootloader程序,用户app程序则负责产品的功能,芯片上电后,它会判断芯片内部是否有bootloader代码(bootloader代码位置固定),若有bootloader程序则会跳转到bootloader程序执行,若没有bootloader程序而只检测到了用户的app程序,那么就直接跳转到app程序运行,当然这个bootloader程序是我们自己写的代码,只是它存储的位置和app程序是不一样的。
2、flash空间布局对DFU的影响:
(1)、single bank布局不支持softdevice及bootloader自身的升级,只支持该芯片上应用程序的升级,且采用这种方式的,一旦开始升级,芯片上原有的应用程序将不能被保存。
(2)、以dual bank布局的方式中,在开始接收新的二进制程序(image)时,原有的二进制程序(image)将会被保留,如果升级失败不会影响芯片上原有的程序,采用dual bank升级的代码大小不能超过总(内存-SoftDevice size - Bootloader size)/2

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第1张图片

【nRF52832的DFU实现】
由原理可知,我们需要自己写bootloader,自己写应用程序app(在nRF52832中,不是手机APP),开发过52832的都知道还要单独的协议栈softdevice,所以我们看到要实现无线DFU,nRF52832要有softdevice,bootloadr,app三个支持,有了这三个直接下载到芯片中就行了吗?还需要setttings,用于设备启动后由bootloader到app的自动跳转。
1、如何下载正确的softdevice 协议栈?
      直接在SDK包内.....\components\softdevice\s132\hex  目录下找对应的hex文件,就是当前SDK对应的正确版本协议栈softdevice ,不会出现版本不匹配的问题,关于SDK与softdevice的关系请参考[文档](https://mp.csdn.net/mdeditor/83276623#)
2、如何使用bootloder?
bootloader的作用在上文已有描述,我们应用时可以直接使用SDK中的bootloader_secure例程,目录如下为
........\examples\dfu\secure_bootloader\pca10040_ble\arm5_no_packs,但是你直接编译会发现存在很多error,大体分为2类:

1)uecc.h 文件找不到; 2)需要生成私有的 key,下面的操作步骤主要介绍如何处理这两类error,使bootloader为我们所用。

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第2张图片

(1)安装必要软件(参照艾克姆开发手册整理)

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第3张图片

(2)工程中加入micro-ecc源码,解压micro-ecc-master 压缩包至......external\micro-ecc 目录下

(3)生成micro_ecc_lib_nrf_52.lib:打开安装的MINGW 下的msys.bat工具,定位到nrf_52_keil目录下的armgcc, make生成需要的lib文件,注意将此lib文件加入到工程的路径中

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第4张图片

(4)生成私钥private.key和公钥public.key:命令窗口中直接输入指令生成,目录自己选择,先生成私钥,再生成公钥,因为后者基于前者生成。

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第5张图片

(5)将新生成的公钥替换掉原工程目录下的

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第6张图片

以上全部搞定后,再次编译工程,OK;

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第7张图片

3、如何烧写代码至单板中?共三种方法

(1)手机DFU方式:完成如上bootloader后就需要按顺序烧写我们的代码,使用nRFgo Studio ,首先烧写协议栈,再烧写bootloader,然后打开手机nRF Connect 工具,蓝牙连接单板,通过DFU将打包的应用程序加载至单板进行无线升级,这里打包的应用程序指的是 私钥和应用程序的打包,下面再说明。

 从上面看,操作有点繁琐,为什么不直接用nRFgo Studio 下载应用程序,而一定要用手机DFU呢?因为就算这样下载了,也不会工作,因为设备启动后,首先会检测settings的CRC,如果没有settings,程序就卡在bootloader了,不会跳转至应用程序继续执行,所以这里需要再搞个seetings文件出来。

(2)生成settings,直接通过nRFgo Studio下载(协议栈->settings->bootloader->应用程序)

生成seetings方法:把生成的应用程序放在单独文件夹中改名为app.hex,鼠标放在空白处,shift+右键执行“在此处打开命令窗口”,输入命令:
nrfutil settings generate --family NRF52 --application app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 settings.hex   输入完成后回车

(3)合并下载

步骤2中的方法适合调试应用,但在批量生产时不合适,效率太低,所以此处介绍利用mergehex合并烧写方法:

因mergehex 一次最大合并3个文件,所以我们需要分两次合并,将协议栈,bootloader和app存在单独文件夹,鼠标放在空白处,shift+右键执行“在此处打开命令窗口”,输入命令:

mergehex -m s132_nrf52_6.1.0_softdevice.hex nrf52832_xxaa_s132_Bootloader.hex app.hex -o out3.hex

此时完成一次文件合并,再次输入命令:
mergehex -m out3.hex settings.hex -o out4.hex,至此,直接用nRFgo Studio 下载一个文件即可。

4、工程中加入DFU服务

注意,如上的APP.hex 是要在工程中加入DFU服务后的,具体如何加入,参照官方 的例程即可,加入相关的.c文件,头文件目录,包含对应头文件,开启sdk_congfig.h中的对应模块接口,官方例程目录:

......\nRF5_SDK_15.2.0_9412b96\nRF5_SDK_15.2.0_9412b96\examples\ble_peripheral\ble_app_buttonless_dfu

5、手机端的升级文件打包

以上的步骤都是针对52832的,那么写好的应用程序如何通过手机端加载给单板呢?这里就需要利用上面我们生成的私钥和app.hex文件,二者打包后存在手机中,手机开启nRF Connect工具,将升级包加载给单板:

(1)升级包打包方法:

将私钥 private.pem  和app.hex 放在同一文件夹,鼠标放在空白处,shift+右键执行“在此处打开命令窗口”,输入命令:
nrfutil pkg generate --hw-version 52 --application-version 1 --application app.hex --sd-req 0xAF --key-file private.pem dfufile.zip

这里需要注意,hw-version,如果是nRF52832,则设置为52,如果是51822,则为51;sd-req,协议栈的ID,不同的协议栈ID不同,可以根据nRFgo Studio中提示确定:

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第8张图片

(2) 手机nRF Connect 连接 单板进行DFU:经如下操作后,再点击右上角DFU,选择升级文件,等待完成后即可。

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第9张图片  -》 nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第10张图片进入bootloader

-》再次连接DFUTARG,选择后上脚DFU,选择升级文件包,即可看到升级界面,升级后自动断开,系统重启OK

nRF52832——无线DFU的原理与步骤(基于SDK15.2)_第11张图片

你可能感兴趣的:(嵌入式)