实现NRF52832蓝牙DFU无线升级
需要使用到的工具
- nrfutil(生成私有秘钥)
- make工具(Windows下实现Makefile,使用MinGW,GNU Make或Xcode)
- GCC编译器工具链(编译micro-ecc源码)
- micro-ecc源码(nordic的DFU采用了micro-ecc实现ECDSA算法,需要用到micro-ecc源码)
- python2.7(用来安装nrfutil)
- 官方SDK(最低SDK v12,此例子演示是使用SDK15.0)
选用相关工程
- 使用SDK中的 nRF5_SDK_15.0.0_a53641a\examples\dfu\secure_bootloader\pca10040_ble工程生成BootLoader固件。
第一次编译BootLoader工程会出现两种错误:
1.没有有效的签名
2.缺少uECC.h文件
消除这两个错误需要用到上面讲到的工具 - 选择任意一个APP程序作为升级的APP固件,本次采用nRF5_SDK_15.0.0_a53641a\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs作为app应用
工具安装
- 安装make工具,解压GNU make工具包gnu-mcu-eclipse-windows-build-tools-2.12-20190422-1053-win64.zip到电脑**C:\Program Files (x86)**目录中
- 将C:\Program Files (x86)\GNU MCU Eclipse\Build Tools\2.12-20190422-1053\bin添加到系统环境变量
- 打开命令行查询版本号,确保工具可以使用
- 解压文件micro-ecc-master.zip到SDK文件夹中的nRF5_SDK_15.0.0_a53641a\external\micro-ecc文件夹中并修改文件夹名称为micro-ecc
- 安装python2.7,一直选择默认下一步即可
- 将安装的目录添加到系统环境变量中
- 安装GCC编译工具链,默认选择一直下一步即可
- 打开命令行查询版本号,确保工具可以使用
- 使用python安装nrfutil工具(该工具是为了生成秘钥和固件打包),打开命令行执行python -m pip install nrfutil命令安装nrfutil。
(本人试过多台电脑,有的可以顺利安装,也有出现过以下错误的,无法正常安装,只要把下载源更改成国内的就就可以了,参考下面的操作)
- 打开任意文件夹路径输入%AppData%
- 在该文件下新建pip文件夹,文件夹内新建一个pip.ini文件,输入下面内容更换成国内源
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
- 重新打开命令行输入python -m pip install nrfutil命令安装nrfutil
- 安装完成后输入nrfutil指令出现上图提示指令格式说明安装nrfutil成功
BootLoader固件生成及DFU升级操作
- 建立一个文件夹key,在该文件夹中打开命令行执行nrfutil keys generate private.key命令,执行后该文件夹将会多出一个秘钥文件
- 通过这个秘钥文件生成公钥,继续输入nrfutil keys display --key pk --format code private.key --out_file dfu_public_key.c命令,执行后文件夹将会多出一个dfu_public_key.c公钥源文件,将生成的dfu_public_key.c文件替换之前nRF5_SDK_15.0.0_a53641a\examples\dfu文件夹下的dfu_public_key.c文件,这样就可以将之前的缺少秘钥的错误消除掉了
- 编译uECC库,进入nRF5_SDK_15.0.0_a53641a\external\micro-ecc文件夹中双击build_all.bat编译生成各中环境需要使用的库文件
- 完成后重新编译以下BootLoader工程将无错误和警告,生成BootLoader固件
- 编译例程中的nRF5_SDK_15.0.0_a53641a\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs工程,生成app应用(这个可以使用任意app程序,此次演示使用了该例程)
- 将编译好的app固件拷贝到key文件夹中,在该文件夹中打开命令行输入nrfutil pkg generate --hw-version 52 --application-version 1 --application nrf52832_xxaa.hex --sd-req 0xa8 --key-file private.key app_dfu_package.zip 生成升级包。
(注意:打包用到的秘钥文件和BootLoader工程用到的秘钥文件必须为同一个,否则秘钥不一样会升级失败) - 使用nrf studio将协议栈和刚才生成的BootLoader固件下载到目标设备中(如果下载出现失败,先将正片擦除一遍)
- 下载成功后此时设备已经进入DFU模式可以进行升级了。将刚才生成的升级包app_dfu_package.zip发生到手机中。打开nRF Connect app,进行搜索蓝牙,DfuTarg蓝牙是刚才烧录的蓝牙设备,点击进行连接
- 连接成功后点击右上角的DFU按钮选择升级的文件,点击OK 确认进行升级
- 此时设备正在升级中
- 升级完成后则可以看到应用程序(Nordic_Buttonless)以及开始运行了