一、开发环境及工具
- nRF5 SDK v15.3.0
- IAR For ARM V7.80.4 / Keil uVision5(MDK-ARM) V5.33
- 此工程源码下载路径 : https://gitee.com/amx/nrf52xx-project
二、移植DFU功能前准备
- DFU(Device Firmware Update),即设备固件升级。可以有多种方式,如OTA、UART、USB等,这里我们介绍OTA
- nRF52xx进行OTA升级需要烧录3种固件:softdevice、bootloader、application,我们需要编译bootloader、application工程
- 了解添加DFU功能后Flash带协议栈和Bootloader布局,更多可以查看nRF52-Note(04)-Memory Layout文章

下面我们演示如何在nRF5 SDK v15.3.0版本上一步步实现OTA功能。
三、安装相关工具软件
| 名称 | 描述 |
|---|---|
| J-Link | V6.81d |
| nRF Connect For Desktop | V3.6.1,可选 |
| nRF-Command-Line-Tools | V10.9.0 |
| Python | Python2.7或Python3.7或更高版,可选 |
| nrfutil | V6.1.0 |
| nRF Connect for Mobile | 手机端APP |
| nRF Toolbox App | 手机端APP |
- 安装nRF Connect For Desktop (可选),用来烧录固件,这里我们使用最新版本V3.6.1:

- 安装nRF-Command-Line-Tools,用来合成和烧录DFU固件,这里我们使用10.9.0版本:

(1)将其安装路径添加进系统环境变量中:

(2)在PowerShell中输入nrfjprog --version和mergehex --version验证是否安装成功:

-
安装Python2.7或Python3.7或更高版本(可选),目的是使用其命令来安装nrfutil
-
安装nrfutil,用来生成密钥和打包升级文件,这里有两种安装方式:
(1)直接下载使用nrfutil.exe文件,简单方便(我们使用此方法)

(2)使用python中的pip命令安装,此方法较为麻烦,可能你会遇到其它一些奇怪的安装问题,这里不讲解。
我们将nrfutil.exe放到nRF-Command-Line-Tools的安装路径下,在PowerShell输入nrfutil version查看版本:

四、修改Application工程
- 添加DFU相关文件:

-
添加宏定义
BL_SETTINGS_ACCESS_ONLY NRF_DFU_SVCI_ENABLED NRF_DFU_TRANSPORT_BLE=1 -
配置sdk_config.h中的宏
#ifndef BLE_DFU_ENABLED #define BLE_DFU_ENABLED 1 // 使能DFU #endif #ifndef NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS #define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0 // 无绑定升级方式 #endif // <o> NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. #ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1600 // 增加Attribute Table空间 #endif // <o> NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. #ifndef NRF_SDH_BLE_VS_UUID_COUNT #define NRF_SDH_BLE_VS_UUID_COUNT 2 // 这里用到了NUS和DFU两个自定义的UUID #endif -
将RAM起始地址由0x20002a98改为0x20002ba8

- 在项目中添加DFU相关函数和服务并编译,具体请查看源代码
五、编译Bootloader工程
-
编译安装micro-ecc加密库:
这里我们演示使用安全式空中升级方式(相对与开放式升级),需要下载使用加密库micro-ecc,解压到external\micro-ecc路径下,并编译安装。如果用户需要自行安装,还需要在Windows上额外的安装Git和GCC编译器,再运行build_all脚本完成编译。用户也可以使用他人编译好的加密库文件,直接替换掉原来的目录文件。我们项目代码中已经编译安装好micro-ecc,可以打包参考使用。

-
通过nrfutil生成公私钥对:
(1)进入examples\dfu目录下,将dfu_public_key.c复制备份成dfu_public_key_backup.c
(2)在该目录下,按住键盘Shift键,然后单击鼠标右键选择“在此处打开PowerShell窗口”,打开PowerShell

(3)输入命令生成私钥:nrfutil keys generate private_key.pem
(4)输入命令生成公钥:keys display --key pk --format code private_key.pem --out_file dfu_public_key.c

(5)这时你会发现目录下多了private_key.pem文件,dfu_public_key.c也被修改:

注意:请务必保管好自己的private_key.pem文件,以后每次升级新固件时,都会通过它进行签名,一旦丢失或者被暴露,DFU将无法进行或者变得不安全
-
编译Bootloader工程:
(1)进入examples\dfu\secure_bootloader打开对应的ble工程并,编译生成bootloader的hex文件

(2)此时我们也可以查看下Bootloader工程的RAM和Flash的空间分配

六、生成升级文件和烧录文件
-
在examples\dfu目录下新建文件夹secure_dfu_images,将工程编译好的application、bootloader文件拷贝到此目录,分别重新命名为nrf52xx_app.hex、nrf52xx_bootloader.hex
-
将softdevice文件和生成的私钥private_key也拷贝到此目录
-
在目录下创建脚本文件1_build.bat,在里面添加如下内容,符号::后面为注释内容:
::generate settings page for current image
nrfutil.exe settings generate --family NRF52 --application nrf52xx_app.hex --application-version 3 --bootloader-version 2 --bl-settings-version 2 bootloader_settings.hex
::merge bootloader,softdevice,app and settings
mergehex.exe --merge nrf52xx_bootloader.hex s132_nrf52_6.1.1_softdevice.hex --output production_final1.hex
mergehex.exe --merge production_final1.hex nrf52xx_app.hex --output production_final2.hex
mergehex.exe --merge production_final2.hex bootloader_settings.hex --output nrf52xx_firmware.hex
::generate upgrade pack
nrfutil pkg generate --hw-version 52 --sd-req 0xB7 --application-version 0xff --application nrf52xx_app.hex --key-file private_key.pem nrf52xx_app_update.zip
del production_final1.hex
del production_final2.hex
pause
上述命令选项中0xB7的值为对应的softdevice版本的值,可以通过nrfutil pkg generate --help命令查看,我们使用s132_nrf52_6.1.1_softdevice版本:

更多关于nrfutil和mergehex命令介绍可以访问https://infocenter.nordicsemi.com/index.jsp查看文档:

- 双击运行1_build.bat,生成烧录文件nrf52xx_firmware.hex和升级文件nrf52xx_app_update.zip,前者用于烧录MCU,后者用于OTA升级

-
新建脚本文件2_program.bat,用于烧录固件,加入以下内容:
nrfjprog -f NRF52 --eraseall nrfjprog -f NRF52 --program "nrf52xx_firmware.hex" --verify nrfjprog -f NRF52 --reset pause双击运行2_program.bat,将固件nrf52xx_firmware.hex烧录到芯片中。
也可以使用nRF Connect For Desktop进行烧录:

七、手机APP升级测试
- 在手机端安装nRF Toolbox软件
- 将nrf52xx_app_update.zip升级文件发送到手机端,比如通过微信
- 在文件打开方式中选择nRF Toolbox
- nRF Toolbox使用步骤及nRF Connect查看截图:

好文推荐: https://www.cnblogs.com/iini/p/9314246.html
本文详细介绍了如何在nRF5SDKv15.3.0环境下,结合IAR或Keil开发工具,实现nRF52840芯片的OTA DFU功能。步骤包括:准备开发环境、修改应用和Bootloader工程、安装相关软件、生成升级文件和烧录。此外,还涉及了安全升级所需的公私钥生成以及使用nRFUtil工具进行固件打包和烧录。
725

被折叠的 条评论
为什么被折叠?



