2018年9月11日
SDK版本:nRF5_SDK_15.0.0_a53641a
SoftDevice版本:s132_nrf52_6.0.0
官方论坛中有官方人员写了Blog说明:Getting started with Nordic's Secure DFU bootloader, a step by step guide
DFU: Device Firmware Upgrade
前期准备
sdk12以后,DUF功能对升级文件进行了ECDSA签名加密,防止误升级未授权的程序.
nRF52832使用micro-ecc开源软件实现ECDSA
安装make
为了使用sdk中micro-ecc的安装脚本,需要安装make及git
安装git
不多说,这个应该都已经装好了
安装micro-ecc
以上两个安装后,直接执行sdk路径中的[SDK]\external\micro-ecc\build_all.bat脚本即可安装micro-ecc
安装nrfutil
签名需要秘钥,需要使用nrfutil生成秘钥.
nrfutil在nRFgo Studio工具安装路径中有,但是版本非常低(0.x.x),为了使用最新版本,自己安装一个.
nrfutil是一个python工具,所以需要先安装Python下载地址,注意:必须使用2.7以上版本,但是不能使用3.0以上版本,也就是2.7-3.0之间的版本~
python安装完成后,在python路径使用python -m pip install nrfutil
安装nrfutil
目前(2018年9月11日)安装的最新版本为3.5.1.
nrfutil会安装在python路径下的Scripts文件夹内,如果不配置nrfutil的环境变量,需要到此文件夹执行nrfutil命令(不建议).
生成秘钥文件
这些命令可以在sdk文档 nRF5 sdk-Libraries-Bootloader and DFU modules-Device Firmware Update process-Working with keys 中也有说明.
生成自己的私钥:
nrfutil.exe keys generate private.pem
根据私钥生成公钥:
nrfutil.exe keys display --key pk --format code private.pem --out_file public_key.c
会在当前路径下生成文件public_key.c,需要将此文件内数组uint8_t pk[64]复制到bootloader工程的相应位置,一般在dfu_public_key.c中
烧录协议栈、应用层、bootloader
生成bootloader setting
这个文件包含了app version,bootloader version,hw version
命令如下:注意hex文件名称
nrfutil.exe settings generate --family NRF52 --application nrf52832_xxaa.hex --application-version 0 --bootloader-version 0 --bl-settings-version 1 bootloader_settings.hex
合并hex文件:
合并BootLoader文件和softdevice文件:
mergehex.exe --merge nrf52832_xxaa_bootloader.hex s132_nrf52_4.0.2_softdevice.hex --output production_final1.hex
将上一个合并文件与app程序合并:
mergehex.exe --merge production_final1.hex nrf52832_xxaa_app.hex --output production_final2.hex
将上一个合并文件与配置settings 文件合并:
mergehex.exe --merge production_final2.hex bootloader_settings.hex --output production_final.hex
之后可以删除中间生成的两个hex文件
del production_final1.hex
del production_final2.hex
最后的production_final.hex文件就是我们需要烧录的文件了.
烧录hex文件
使用nRFgo 擦除flash,使用program application烧录这个文件即可,烧录完成后可以看到flash有softdevice application 及bootloader,且程序已经可以正常运行
生成DFU 升级文件
Application
先是应用层
执行命令:
nrfutil pkg generate --hw-version 52 --sd-req 0xa8 --application-version 0xff --application nrf52832_xxaa_app.hex --key-file private.pem nrf52832_xxaa.zip
其中 --sd-req
参数为SoftDevice的Firmware ID,可以使用nRFgo烧录SoftDevice后,在flash表中看到
Region 0 (SoftDevice)
Size:152kB
Firmware:
Unknown(Id:0x00a8)
最后的id即为需要的值
生成的nrf52832_xxaa.zip即为我们需要的文件
DFU
这些命令可以在sdk文档 nRF5 sdk-Libraries-Bootloader and DFU modules-Device Firmware Update process-Validation 中查询到.
文件生成后就可以DFU升级了
使用自己设置的方式使nrf52832进入DFu模式,手机使用nRF Connect软件连接DFU的蓝牙设备(默认名称为DFUTARG),点击右上角DFU按钮,选择zip文件,选择上一步的zip文件即可升级,升级完成nrf52832自动重启运行新固件.
总结
将以上命令总结一下,下次用的时候就直接在这里复制了
@echo off
copy "D:\Documents\Desktop\nRF52832\nRF5_SDK_15.0.0_a53641a\examples\dfu\secure_bootloader\pca10040_ble\arm5_no_packs\_build\nrf52832_xxaa_s132.hex" "bootloader.hex"
copy "E:\Program\nRF5\nRF52832_Test\_build\nrf52832_xxaa.hex" "nrf52832_xxaa_app.hex"
set path=C:\Python27\Scripts
::生成bootloader setting文件
nrfutil.exe settings generate --family NRF52 --application nrf52832_xxaa_app.hex --application-version 0 --bootloader-version 0 --bl-settings-version 1 bootloader_settings.hex
::合并bootloader softdevice
"C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\mergehex.exe" --merge bootloader.hex "D:\Documents\Desktop\nRF52832\s132_nrf52_6.0.0\s132_nrf52_6.0.0_softdevice.hex" --output production_final1.hex
::再合并application
"C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\mergehex.exe" --merge production_final1.hex nrf52832_xxaa_app.hex --output production_final2.hex
::合并bootloader setting
"C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\mergehex.exe" --merge production_final2.hex bootloader_settings.hex --output production_final.hex
::删除中间文件
del bootloader_settings.hex
del production_final1.hex
del production_final2.hex
::"C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\nrfjprog" -f NRF52 --eraseall
::"C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\nrfjprog" f NRF52 --program "production_final.hex" --verify
::"C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin\nrfjprog" -f NRF52 --reset
nrfutil pkg generate --hw-version 52 --sd-req 0xa8 --application-version 0xff --application nrf52832_xxaa_app.hex --key-file private.pem nrf52832_xxaa_app.zip
pause