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

news2025/4/9 6:22:52

需要用到的软件:

交叉编译环境: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:\MinGW\bin添加至环境变量。安装成功后在命令行输入gcc -v可以查看是否安装成功。
在这里插入图片描述

micro-ecc拷贝

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

Python安装

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

nRFUtil安装

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

生成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会有如下提示:
在这里插入图片描述
按照红框中的提示,在相应路径下用记事本打开,改成自己电脑中的路径(注意路径中用/,不是\):
在这里插入图片描述
之后输入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_ddde560\nRF5_SDK_17.1.0_ddde560\examples\dfu路径下的dfu_public_key.c。
在这里插入图片描述

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。
在这里插入图片描述
在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_ddde560\nRF5_SDK_17.1.0_ddde560\components\softdevice\s140\hex路径下的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_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文件。
在这里插入图片描述

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升级。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【爬虫】JS调试解决反爬问题系列3—sign破解

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

LabVIEW如何减少下一代测试系统中的硬件过时 1

LabVIEW如何减少下一代测试系统中的硬件过时 1 许多测试系统的问题是,整个系统运行的时间必须超过单个系统组件的支持时间。有时被测试的设备有几十年的有效使用寿命,而许多测试仪器已经过时,在5年或更短的时间后就不再支持了。其他时候&…

技能梳理32@电源防反接电路+光耦隔离电路+串口磁耦隔离电路

电源防反接电路 CN2是个防反接插座; F1是个自恢复保险丝; MB6S是个整流桥电路,主要是这个模块实现的防反接效果; SPX3819是个电平转换模块,封装挺小的;LDO-EN是用来控制SPX3819是否使能的; …

等保2.0参与医院网络安全管理的重要性

随着现代医院 IT 技术架构的演变、新兴技术的引入,来自医院内外部的各种安全风险不断出现,对医院网络安全提出了更多挑战,医院网络安全在技术层面和管理层面都亟待完善。为此,借鉴相关法律法规、行业标准等,提出提升现…

Web前端开发神器WebStorm v2022.3发布——支持新的CSS功能

WebStorm是一款JavaScript 开发工具。被广大中国JS开发者誉为"Web前端开发神器""最强大的HTML5编辑器""最智能的JavaSscript IDE"等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。 WebStorm v2022.3官方正式版下载…

百度工程师教你玩转设计模式(装饰器模式)

作者 | 北极星小组 想要写好代码,设计模式(Design Pattern)是必不可少的基本功,设计模式是对面向对象设计(Object Oriented Design)中反复出现的一类问题的一种解决方案,本篇介绍装饰器模式&am…

(第一章)OpGL超级宝典学习:配置和超级宝典相同的工作环境

目录前言配套资源配置解压文件夹复制资源HOWTOBUILD什么是CMake什么是GLFW安装CMake开始构建build glfw生成debug和release的lib库build sample推送结语前言 最近发现学习好像到了一定的瓶颈,马上要到2023年了,想要在新的一年开始后对自己有一定的突破&a…

Kubernetes 实现自动扩容和自愈应用实践

Kubernetes 自动扩容和自愈 tags: 实践 文章目录Kubernetes 自动扩容和自愈1. 背景2. 准备3. kind 部署 kubernetes4.实践4.1 部署 deployment4.2 创建 Service4.3 创建 Ingress4.4 部署 Ingress-nginx4.5 K8s 实现自愈4.6 k8s 实现自动扩容5. 其他1. 背景 在生产非 kubernet…

java进阶—List

上节回顾 List 是一个有序的,允许重复的Collection,其下的子类主要有 ArrayList LinkedList,Vector(这个官方不推荐使用) 那么同为list的子类,ArrayList 跟 LinkedList 有什么区别呢? 这里就涉及到了list的底层两种实现方式&…

《计算机体系结构量化研究方法》第2章-存储器层次结构设计 2.1 引言

一、概述 1、存储器层次结构:层次由速度和容量各不相同的存储器组成。 2、存储器层次结构被分为几个级别——离处理器越近,容量越小速度越快。 3、包含性质:大多数情况下,低层级存储器中的数据是上一级存储器中数据的超集。比如…

基于RSA的数字签名设计与实现

信息安全课程的第二个实验,主要是用java、js,前端页面用的html写的。 页面成果展示: 基本公私钥生成 实验环境为win10系统,使用git命令行工具——git bash生成公私钥。生成私钥,密钥长度为1024bit并从私钥中提取公钥 …

如何在 Spring Boot 项目中开启 “热部署“

目录 1. 添加热部署框架支持 2. 设置当前项目 Settings 和新项目 Settings 开启项目自动编译 3. 开启运行中热部署 4. 使用 Debug 启动项目 (社区版 IDEA) 1. 添加热部署框架支持 在 pom.xml 中添加如下框架引用: <dependency><groupId>org.springframework.b…

vue3中常用的三种组件传值方式

比较大型的项目中经常会涉及到多个组件之间进行传值&#xff0c;所以对之前用过的一些传值方法做个笔记&#xff0c;还有就是对不同的情况下需要使用哪一种传值方法更合适的思维进行一个总结 vue3中常用的三种组件传值方式mitt依赖注入pinia总结mitt 因为vue3去掉了全局事件总…

qt实现的pdf阅读器(二)--XpdfReader在linux下的编译

目录 1.简介 2.需求说明 3.编译 3.3. 下载源码 3.2. 移植安装包和依赖库 3.2.1 准备工作 3.3.2 了解 3.3.3 编译并安装zlib 3.3.4 编译并安装libpng 3.3.5 编译并安装lcms 3.3.6 编译并安装freetype 3.3.7 编译xpdf 3.3.8 查看运行编译好的xpdf 1.简介 Xpdf 是一个免…

我以为自己MySQL够牛逼了,直到看到了Alibaba的面试题

前言 众所周知&#xff0c;简历上“了解&#xff1d;听过名字&#xff1b;熟悉&#xff1d;知道是啥&#xff1b;熟练&#xff1d;用过&#xff1b;精通&#xff1d;做过东西”。 相信大家对于MySQL的索引都不陌生&#xff0c;索引(Index)是帮助MySQL高效获取数据的数据结构。…

SpringBoot Disruptor框架遇到的问题

1.消息重复消费问题 问题描述&#xff1a; 项目中启动了多个消费者,测试中发现同一条消息被多次消费。 解决方案&#xff1a; ①幂等方案处理 ②disrutor提供了不同的处理机制&#xff1a; 自定义消费者实现EventHandler接口,他是属于重复消费&#xff0c; 自定义消费者实现W…

SVN培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128417196 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

【矩阵论】7. 范数理论——非负/正矩阵

7.5 非负/正矩阵 7.5.1 定义 a. 非负/正矩阵定义 一个实矩阵 A(aij)∈RmnA(a_{ij})\in R^{m\times n}A(aij​)∈Rmn 若对每一 iii 和 jjj &#xff0c;aij≥0a_{ij}\ge 0aij​≥0 &#xff0c;则称A是非负矩阵&#xff0c;A≥0A\ge 0A≥0 若对每一 iii 和 jjj &#xff0c;…

简单四则运算语法树可视化

简单四则运算语法树可视化 前几天有一篇博客是关于四则运算和二叉树的&#xff0c;我是把四则运算用二叉树写出来&#xff08;我是用的 JSON 的形式来存储和表达的&#xff09;&#xff0c;并计算最终的结果。最近&#xff0c;也在继续这个方面的东西&#xff0c;不过遇到一些…

uni-app 微信支付-小程序、APP、IOS

小程序 支付 先看官方文档 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml 知晓有那些比不可少的流程&#xff0c;之后后端确定返回的参数值&#xff0c;用于前端支付。参数值必须一一对应&#xff0c;不然支付会失败 uni.requestPayment({timeStamp…