我是靠谱客的博主 优美魔镜,最近开发中收集的这篇文章主要介绍使用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按照默认配置直接安装,在完成页面选择添加至环境变量。
在这里插入图片描述

MinGW安装

MinGW按照默认配置安装,到Installation Manager界面选择如下三个package:
在这里插入图片描述
点击左上角Installation→Apply Changes后点Apply。安装完成后将路径C:MinGWbin添加至环境变量。安装成功后在命令行输入gcc -v可以查看是否安装成功。
在这里插入图片描述

micro-ecc拷贝

将下载的micro-ecc-master压缩包解压后重命名为micro-ecc,然后拷贝到nRF5_SDK_17.1.0_ddde560externalmicro-ecc路径下。
在这里插入图片描述

Python安装

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

nRFUtil安装

安装了Python后,可以直接在命令行输入pip install nrfutil进行安装。
在这里插入图片描述
可以在命令行输入nrfutil --help查看是否安装成功,下面的Commands就是支持的命令。
在这里插入图片描述

生成micro_ecc_lib_nrf52.lib

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

生成公私密钥

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

新建一个文件夹,命名为key,在命令行切换路径到新建的文件夹,输入nrfutil keys generate private.pem,生成私钥,每次升级的时候需要用私钥对image进行验签。
在这里插入图片描述在这里插入图片描述
然后使用私钥生成公钥.c文件,输入nrfutil keys display --key pk --format code private.pem --out_file dfu_public_key.c后,会在文件夹下生成公钥的.c文件。
在这里插入图片描述
用生成的公钥文件替换E:nRF5_SDK_17.1.0_ddde560nRF5_SDK_17.1.0_ddde560examplesdfu路径下的dfu_public_key.c。
在这里插入图片描述

Boot和App的HEX文件生成

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

App文件使用E:nRF5_SDK_17.1.0_ddde560nRF5_SDK_17.1.0_ddde560examplesble_peripheralble_app_buttonless_dfupca10056s140arm5_no_packs下的keil工程,将生成的HEX文件名称改为ApplicationA。
在这里插入图片描述
在main函数中新增log输出NRF_LOG_INFO(“My App - A.”);编译。然后将HEX文件名称改为ApplicationB,main函数中log输出改为NRF_LOG_INFO(“My App - B.”);编译,将生成的两个HEX文件复制到key文件夹中。
在这里插入图片描述

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文件夹中生成一个压缩包,这个包就是升级包。
在这里插入图片描述
其中–sd-req这个字段可以通过E:nRF5_SDK_17.1.0_ddde560nRF5_SDK_17.1.0_ddde560componentssoftdevices140hex路径下的hex文件名称确定型号后匹配nrfutil pkg generate --help命令执行后的ID列表。
在这里插入图片描述
使用nRF Connect for Desktop下载协议栈的时候打开hex文件会直接显示ID。
在这里插入图片描述

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包含的信息如下:
在这里插入图片描述
在命令行切换路径到key文件夹,输入nrfutil settings generate --family NRF52840 --application ApplicationA.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 settings.hex,生成Bootloader Settings文件。
在这里插入图片描述
其中–family参数设置如下:
在这里插入图片描述
–bl-settings-version参数设置如下:
在这里插入图片描述
如果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文件,因此需要两步来完成。
在这里插入图片描述
此处以nrf52832为例,找到对应的协议栈hex文件(路径:nRF5_SDK_17.1.0_ddde560componentssoftdevices132hex)复制到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文件。
在这里插入图片描述

DFU测试

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

最后

以上就是优美魔镜为你收集整理的使用Nordic的nrf52840实现蓝牙DFU过程的全部内容,希望文章能够帮你解决使用Nordic的nrf52840实现蓝牙DFU过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部