使用Nordic的nrf52840实现蓝牙DFU过程

需要用到的软件:

交叉编译环境:gcc-arm-none-eabi
MinGW:下载
Python:下载
micro-ecc源码:下载
nRFUtil:下载或者直接使用python的pip来安装

手机app:nRF Toolbox或者nRF Connect

安装

gcc-arm-none-eabi安装

gcc-arm-none-eabi按照默认配置直接安装,在完成页面选择添加至环境变量。
使用Nordic的nrf52840实现蓝牙DFU过程_第1张图片

MinGW安装

MinGW按照默认配置安装,到Installation Manager界面选择如下三个package:
使用Nordic的nrf52840实现蓝牙DFU过程_第2张图片
点击左上角Installation→Apply Changes后点Apply。安装完成后将路径C:\MinGW\bin添加至环境变量。安装成功后在命令行输入gcc -v可以查看是否安装成功。
使用Nordic的nrf52840实现蓝牙DFU过程_第3张图片

micro-ecc拷贝

将下载的micro-ecc-master压缩包解压后重命名为micro-ecc,然后拷贝到nRF5_SDK_17.1.0_ddde560\external\micro-ecc路径下。
使用Nordic的nrf52840实现蓝牙DFU过程_第4张图片

Python安装

如果安装有多个版本的Python,可以参考使用Nordic的nRF52840 Dongle配合Wireshark对蓝牙设备抓包(BLE)安装。

nRFUtil安装

安装了Python后,可以直接在命令行输入pip install nrfutil进行安装。
使用Nordic的nrf52840实现蓝牙DFU过程_第5张图片
可以在命令行输入nrfutil --help查看是否安装成功,下面的Commands就是支持的命令。
使用Nordic的nrf52840实现蓝牙DFU过程_第6张图片

生成micro_ecc_lib_nrf52.lib

打开C:\MinGW\msys\1.0路径下的批处理文件msys.bat,输入cd /E/nRF5_SDK_17.1.0_ddde560/nRF5_SDK_17.1.0_ddde560/external/micro-ecc/nrf52nf_keil/armgcc后回车(注意路径中用/,不是\),然后输入make会有如下提示:
在这里插入图片描述
按照红框中的提示,在相应路径下用记事本打开,改成自己电脑中的路径(注意路径中用/,不是\):
使用Nordic的nrf52840实现蓝牙DFU过程_第7张图片
之后输入make,成功生成lib文件
在这里插入图片描述

生成公私密钥

用到的命令帮助,可以查看具体的参数:
nrfutil keys generate --help
nrfutil keys display --help

新建一个文件夹,命名为key,在命令行切换路径到新建的文件夹,输入nrfutil keys generate private.pem,生成私钥,每次升级的时候需要用私钥对image进行验签。
在这里插入图片描述使用Nordic的nrf52840实现蓝牙DFU过程_第8张图片
然后使用私钥生成公钥.c文件,输入nrfutil keys display --key pk --format code private.pem --out_file dfu_public_key.c后,会在文件夹下生成公钥的.c文件。
使用Nordic的nrf52840实现蓝牙DFU过程_第9张图片
用生成的公钥文件替换E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\examples\dfu路径下的dfu_public_key.c。
使用Nordic的nrf52840实现蓝牙DFU过程_第10张图片

Boot和App的HEX文件生成

Boot文件使用E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\examples\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs下的keil工程,编译后生成nrf52840_xxaa_s140.hex,复制到key文件夹中,并重命名为Bootloader.hex。

App文件使用E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs下的keil工程,将生成的HEX文件名称改为ApplicationA。
使用Nordic的nrf52840实现蓝牙DFU过程_第11张图片
在main函数中新增log输出NRF_LOG_INFO(“My App - A.”);编译。然后将HEX文件名称改为ApplicationB,main函数中log输出改为NRF_LOG_INFO(“My App - B.”);编译,将生成的两个HEX文件复制到key文件夹中。
使用Nordic的nrf52840实现蓝牙DFU过程_第12张图片

DFU包生成

用到的命令帮助,可以查看具体的参数:
nrfutil pkg generate --help

在命令行切换路径到key文件夹,输入nrfutil pkg generate --hw-version 52 --sd-req 0x100 --application-version 2 --application
ApplicationB.hex --key-file private.pem app_dfu_package.zip
之后会在key文件夹中生成一个压缩包,这个包就是升级包。
使用Nordic的nrf52840实现蓝牙DFU过程_第13张图片
其中–sd-req这个字段可以通过E:\nRF5_SDK_17.1.0_ddde560\nRF5_SDK_17.1.0_ddde560\components\softdevice\s140\hex路径下的hex文件名称确定型号后匹配nrfutil pkg generate --help命令执行后的ID列表。
使用Nordic的nrf52840实现蓝牙DFU过程_第14张图片
使用nRF Connect for Desktop下载协议栈的时候打开hex文件会直接显示ID。
使用Nordic的nrf52840实现蓝牙DFU过程_第15张图片

Bootloader Settings文件生成

用到的命令帮助,可以查看具体的参数:
nrfutil settings generate --help

如果直接把协议栈、Bootloader和ApplicationA文件下载进去后,会发现广播名称一直是DfuTarg,一直卡在Bootloader里面处于DFU模式,没有进入ApplicationA。这是因为在进入app程序之前boot需要基于Bootloader Settings中的信息对app程序进行完整性检查。在没有app、app完整性校验失败或者没有Bootloader Settings的情况下,boot会进入DFU模式。
在这里插入图片描述
这个时候就需要Bootloader Settings来设置一下相关的信息,使得首次程序下载进去之后直接从Boot转入App运行。Bootloader Settings包含的信息如下:
使用Nordic的nrf52840实现蓝牙DFU过程_第16张图片
在命令行切换路径到key文件夹,输入nrfutil settings generate --family NRF52840 --application ApplicationA.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 settings.hex,生成Bootloader Settings文件。
使用Nordic的nrf52840实现蓝牙DFU过程_第17张图片
其中–family参数设置如下:
使用Nordic的nrf52840实现蓝牙DFU过程_第18张图片
–bl-settings-version参数设置如下:
使用Nordic的nrf52840实现蓝牙DFU过程_第19张图片
如果SDK的版本大于等于15.3.0,–bl-settings-version要设置为版本2,如果设置为版本1的话,BootLoader会在引导之前转换为版本2。

HEX文件合成

用到的命令帮助,可以查看具体的参数:
mergehex --h
实际下载时需要4个hex文件,分别为协议栈、boot settings、boot和app。为了方便烧录,可以把4个文件合成一个hex文件,使用到的工具为nRF Command Line Tools,命令为 mergehex,一次最多可以合成3个hex文件,因此需要两步来完成。
使用Nordic的nrf52840实现蓝牙DFU过程_第20张图片
此处以nrf52832为例,找到对应的协议栈hex文件(路径:nRF5_SDK_17.1.0_ddde560\components\softdevice\s132\hex)复制到key文件夹中。在命令行切换路径到key文件夹,输入mergehex -m s132_nrf52_7.2.0_softdevice.hex bootloader.hex application.hex -o output_file.hex,其中s132_nrf52_7.2.0_softdevice.hex为协议栈文件,bootloader.hex application.hex分别为boot和app文件,这个时候会在key文件夹中生成三合一的hex文件output_file.hex。然后把Bootloader Settings文件合并进去,输入mergehex -m output_file.hex settings.hex -o output_file_finally.hex,这个output_file_finally.hex就是最终要下载进去的hex文件。
使用Nordic的nrf52840实现蓝牙DFU过程_第21张图片

DFU测试

程序下载进去之后,通过串口的log可以看到上电后直接运行了ApplicationA程序。
使用Nordic的nrf52840实现蓝牙DFU过程_第22张图片
进入DFU模式的方法:
使用Nordic的nrf52840实现蓝牙DFU过程_第23张图片
ble_app_buttonless_dfu例程,使用手机上的nRF Connect可以搜到Nordic_Buttonless的蓝牙,连接上之后可以看到有一个UUID为0xFE59的服务,服务特征值为0x0003。
在这里插入图片描述
在这里插入图片描述
使用Nordic的nrf52840实现蓝牙DFU过程_第24张图片
然后先使能指示,再写入数据,之后蓝牙会自动断开连接,进入DFU模式,串口log如下。
使用Nordic的nrf52840实现蓝牙DFU过程_第25张图片
然后就可以搜到一个DfuTarg的设备,连接上之后选择DFU,选择要升级的DFU包,然后点击start进行升级
使用Nordic的nrf52840实现蓝牙DFU过程_第26张图片
升级完成后,串口log显示运行了ApplicationB程序。重新搜索蓝牙,又可以搜到名称为Nordic_Buttonless的蓝牙。
使用Nordic的nrf52840实现蓝牙DFU过程_第27张图片
使用nRF Toolbox的DFU组件一样是先选定升级包,然后点Update升级。
使用Nordic的nrf52840实现蓝牙DFU过程_第28张图片

你可能感兴趣的:(蓝牙,python,nrf52840,DFU,Nordic)