NRF52832学习笔记(22)—— 串口DFU接口使用

一、简介

1.1 串口DFU

DFU(Device Firmware Update) 设备固件升级,而 UART 串口升级技术是DFU其中一种类型。其他类型包括:OTA、USB和SPI等有线方式升级。

第一次烧录时需要将softdevice(协议栈)、bootloader(引导加载程序)、settings(引导程序配置页)、application(用户应用程序)合成一个hex文件进行烧录。

而之后的固件升级,只需通过将application(用户应用程序)合成一个zip的升级包,串口进行上传更新。

以下将分别说明 bootloader、settings、application 、升级包在DFU中的作用及展示它们在Flash中的布局。

1.2 DFU Flash布局

DFU有两种模式,分别为:dual banksingle bank
简单来说 dual bank 模式在升级时系统先进入bootloader,然后把新系统(新固件)下载下来并校验成功,在擦除老系统(老固件),并运行新系统。缺点是耗费比较多的存储空间。

关于dual bank模式详细介绍查看 BLE DFU:Dual Bank

dual bank

single bank 模式在升级时系统先进入bootloader,然后立即擦除老系统(老固件),再把新系统(新固件)下载到原本老系统的存储区域,在运行起来。缺点是如果升级过程中出现问题或新固件有问题,就会一直停留在bootloader,相当于“变砖”了。
single bank

注:Bootloader在接收数据前会检查Bank 1的大小,如果空间足够,就执行Dual Bank,否则当前应用程序,腾出空间执行Single Bank。SDK自动完成这个判断动作。

1.3 Bootloader

bootloader 是引导加载程序,DFU的基本流程就是在 bootloader中接收新固件数据并写入Flash,接收完毕后重启跳转并运行新固件 。其中SDK v11及更早版本中bootloader为开放透明性的Legacy DFU,而SDK v12之后有了加密性的Secure DFU。

关于Legacy DFU详细介绍查看 BLE DFU:Legacy DFU
关于Bootloader详细介绍查看 BLE DFU:Bootloader

1.4 Settings

settings 全称bootloader settings,用于引导设备启动后由bootloader到application的自动跳转。bootloader启动时候,会检查Settings中的 bank0_bank_code、bank0_img_crc,如果二者都正确,则执行跳转进入application,否则驻留在bootloader中执行DFU。

关于settings详细介绍查看 解读Settings文件

1.5 Application

在设备启动后bootloader到application进行正常工作,而当开发者后续需要对系统进行升级时,则需要由application重新跳转到bootloader中,这个过程可以采用按键方式(button)触发,也可以直接用BLE连接发送命令方式(buttonless),本文采取的切换DFU模式方式就是buttonless。

关于application详细介绍查看 BLE DFU:Application


1.6 升级包

从SDK 12开始,Nordic为DFU操作增加了签名校验机制,称为Secure DFU。执行Secure DFU,需要使用升级包(zip),而不能直接使用二进制文件(hex/bin)。
升级包 包括manifest.json(文件清单)、nrf52832_xxaa.bin(新固件)和nrf52832_xxaa.dat(init packet),其中init packet包含了meta信息:新固件的类型、大小、版本和签名信息。这里的签名将在执行DFU被校验。

关于升级包详细介绍查看 BLE DFU:生成升级包
关于init packet详细介绍查看 弄懂 Init Packet

二、安装软件

注意:由于Secure DFU需要micro-ecc库进行签名验证,需要micro_ecc_lib_nrf52.lib,所以需要使用GCC编译器生成。

所以我们只需将micro_ecc_lib_nrf52.lib加入我们的工程(在后面编译bootloader工程中说明),即可忽略以下2.1及2.2的安装

2.1 安装gcc-arm-none-eabi(可跳过)

作用:编译micro-ecc

官网下载:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
百度网盘:https://pan.baidu.com/s/1AQLMOVun3sMcvRd6WqL7AQ 提取码:jh4v

安装gcc-arm-none-eabi过程查看 Secure DFU环境搭建 中2.1,注意要安装在C盘

2.2 安装MinGW(可跳过)

作用:Windows的极简GNU编译器(GCC),执行make

官网下载:https://osdn.net/projects/mingw/releases/
百度网盘:https://pan.baidu.com/s/1QU-DRp8K2xFkUaMNflbs7Q 提取码:w5vy

安装MinGW过程及环境变量配置查看 Secure DFU环境搭建 中2.2和2.3,注意要安装在C盘

2.3 下载micro-ecc-master

作用:Nordic的DFU中采用了micro-ecc实现ECDSA算法,需要用到micro-ecc源码

官网下载:https://github.com/kmackay/micro-ecc
百度网盘:https://pan.baidu.com/s/1GYS5z-nbNgbyzrTk98NHog 提取码:tumw

2.4 安装Python

作用:pc-nrfutil需要用到python-2.7的环境

官网下载:https://www.python.org/downloads/
百度网盘:https://pan.baidu.com/s/1kphEO80KTAjGtVvmoaDWLw 提取码:du7i

安装Python过程及环境变量配置查看 Secure DFU环境搭建 中2.5,注意要安装在C盘

2.5 安装pc-nrfutil

作用:Nordic发布的PC端工具,支持无线DFU和加密功能

官网下载:https://github.com/NordicSemiconductor/pc-nrfutil/
百度网盘:https://pan.baidu.com/s/1L7-Rkv5P3nWG_8Lc-B6YhA 提取码:payb

以下两个选其一
1.把pc-nrfutil解压。打开有setup.py的文件夹,在此处打开dos命令(shift + 鼠标右键)


输入python setup.py install,需要联网

2.打开命令行,输入pip install nrfutil安装nrfutil,需要联网。
安装完成后,输入nrfutil version,如下则表示安装成功。

Python包下载超时问题解决
打开pc-nrfutil-master\requirements.txt


对照左边需要的工具名字替换xxx,输入
pip install xxx -i https://mirrors.aliyun.com/pypi/simple/
改为访问国内的地址加速下载
pip install six -i https://mirrors.aliyun.com/pypi/simple/

三、修改Bootloader工程

3.1 添加工程并编译

找到SDK中 secure_bootloader 工程(nRF5_SDK_15.0.0_a53641a\examples\dfu\secure_bootloader\pca10040_uart\arm5_no_packs)

然后进行编译,发现报出两类错误

  1. uecc.h 文件找不到
  1. 需要生成私有的 key

3.2 加入micro-ecc

把下载的 micro-ecc-master.zip 解压,将下载的一个叫micro-ecc-master文件夹下的四个文件拷贝到报错的路径............\components\libraries\crypto\backend\micro_ecc下
拷贝的四个文件:

3.3 生成micro_ecc_lib_nrf52.lib并加入

生成 micro_ecc_lib_nrf52.lib 过程查看 Secure DFU环境搭建 中2.4

或者下载链接:https://pan.baidu.com/s/1zIUhCe7F4UCuQBQLCHRY8A [18qt]
解压后将 micro_ecc_lib_nrf52.lib 放到对应SDK\external\micro-ecc\nrf52hf_keil\armgcc文件夹下

3.4 生成dfu_public_key.c并加入

3.4.1 首先生成私钥

在D盘新建一个文件夹,命名为key,在cmd命令中输入以下内容:nrfutil.exe keys generate D:\key\private.key指令,生成私钥文件private.key


注意:要保存好私钥private.key,以后每个新固件升级时,都要先通过这个私钥进行签名,一旦丢失,DFU将无法进行

3.4.2 然后生成公钥

输入生成公钥指令:nrfutil.exe keys display --key pk --format code D:\key\private.key --out_file public_key.c

3.4.3 将公钥加入工程

将公钥public_key.c改名为 dfu_public_key.c,并将该文件替换掉目录\examples\dfu下的dfu_public_key.c

3.5 根据情况屏蔽代码

如果LED灯IO口跟secure_bootloader工程默认引脚不同或原来LED引脚用作其他功能,需要将dfu_observer()函数中LED灯相关代码屏蔽,否则会一直运行在bootloader,不跳转到application

3.6 配置sdk_config文件

点击 sdk_config.h 文件


选择 Configuration Wizard

去除流控勾选

四、修改Application工程

进入DFU模式可以通过以下几个源触发:

  • Button(NRF_BL_DFU_ENTER_METHOD_BUTON)
  • Pin reset(NRF_BL_DFU_ENTER_METHOD_PINRESET))
  • GPREGRET寄存器设置特定的值(NRF_BL_DFU_ENTER_METHOD_GPREGRET)
  • 应用程序通过向settings page写入请求(NRF_BL_DFU_ENTER_METHOD_BUTTONLESS)

这里我们选择第3种,通过设置GPREGRET寄存器进入DFU模式。

在自己的串口处理命令中加入

#include "nrf_bootloader_info.h"
#include "nrf_soc.h"
#include "nrf_pwr_mgmt.h"

sd_power_gpregret_clr(0,0xffffffff);                            // 写GPREGRET寄存器之前,需要先清除
sd_power_gpregret_set(0, BOOTLOADER_DFU_START);                 // 写GPREGRET标志位进入DFU模式
nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_DFU);          // 重启

五、烧录固件

5.1 生成bootloader settings

直接烧录softdevice、bootloader和application,会发现application并未运行,芯片一直跑在Bootloader中。

芯片启动后先进入Bootloader,检测Bootloader Settings中的数据,如果这些数据指示Flash中有一个有效的Application,则跳转进入Application。Bootloader Settings是Flash中的一段区域,它包含了Application的大小、CRC等数据,执行DFU时也会在这里存储状态信息。

正常执行DFU时,Bootloader自动生成和维护Bootloader Settings信息。而烧录过程不同,需要手动写入。可以根据application.hex生成一个bl_settings.hex,以产生这些数据,然后烧录这个hex。

生成bl_settings.hex的命令为:
nrfutil settings generate --family NRF52 --application nrf52832_xxaa.hex --application-version 0 --bootloader-version 0 --bl-settings-version 2 settings.hex

其中SDK15.3之后 bl-settings-version值为2,之前的SDK版本值为1

5.2 生成四合一hex文件

mergehex 一次最大合并3个文件,所以我们需要分两次合并,将softdevice(协议栈)、bootloader(引导加载程序)和application(应用程序)编译生成的hex文件存在单独文件夹,鼠标放在空白处,shift+右键执行“在此处打开命令窗口”,输入命令:

mergehex -m s132_nrf52_6.1.1_softdevice.hex bootloader.hex nrf52832_xxaa.hex -o output3tol.hex

此时完成一次文件合并,再次输入命令:
mergehex -m output3tol.hex settings.hex -o output4tol.hex

至此,直接用 nRFgo Studio 下载一个文件即可。

5.3 烧录

5.3.1 使用nRFgo Studio烧录

先擦除,在烧录output4tol.hex

六、升级固件

6.1 生成升级包

将 private.key 和 nrf52832_xxaa.hex 放在同一文件夹,鼠标放在空白处,shift+右键执行“在此处打开命令窗口”,输入命令:
nrfutil pkg generate --hw-version 52 --application-version 1 --application nrf52832_xxaa.hex --sd-req 0xB7 --key-file private.key dfufile.zip
其中 --sd-req 0xB7 为协议栈的版本号
获取协议栈版本号的方法如下:

  1. 通过命令nrfutil pkg generate --help查看
  2. 在线文档论坛帖子中查看
  3. 烧录一个BLE程序,在nrfgo Studio中查看

6.2 使用nrfutil进行升级

在打包的固件目录下cmd运行
nrfutil dfu serial –pkg dfufile.zip –p COM7 –fc 0 –b 115200

6.3 使用C程序进行升级

Nordic nRF5 串口固件更新例子(C代码)
在UartSecureDFU目录下cmd运行
UartSecureDFU.exe COM7 dfufile.zip -v -v

编译好的 UartSecureDFU.exe
链接:https://pan.baidu.com/s/11O3XXn89wUpkp73fBF62RQ 提取码:0yvg


• 由 Leung 写于 2020 年 7 月 20 日

• 参考:Nordic nRF5 串口固件更新例子 (C 代碼)
    nRF52832合并BLE和UART空中升级Bootloader移植记录
    NRF52832DK-DFU固件升级教程
    NRF52840 DFU升级(四):GPREGRET标志位升级

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342