Nordic的DFU服务以前也经常用,不过在SDK15.2上还第一次用,我们可以分几步去实现空中升级
1、移植代码,可以参考例程nRF5_SDK_15.2.0_9412b96\examples\ble_peripheral\ble_app_buttonless_dfu;
2、打包HEX文件
3、使用nrf toolbox进行空中升级
虽然分了这几步,但是操作起来还是会遇到很多的问题的,首先来移植代码,我是在ble_app_uart这个例程里
添加DFU功能,将DFU相关的文件加入到工程
ble_dfu.c
ble_dfu_bonded.c
ble_dfu_unbonded.c
nrf_dfu_svci.c
然后再在main.c函数里添加DFU功能的相关程序,如果不添加,在你升级的时候会提示你找不到DFU的服务
可以参考ble_app_buttonless_dfu例程添加需要的代码及头文件,移植完成后,必不是就结束了,编译没有问题
但是运行的时候你就会发现 Fatal error错误,这是因为NRF_SDH_BLE_VS_UUID_COUNT这个参数是1,将它
改成比1大的数,我将它改成了4.还将参数NRF_SDH_BLE_SERVICE_CHANGED改成了1.编译通过
但是运行还是报错
<warning> nrf_sdh_ble: Insufficient RAM allocated for the SoftDevice.
<warning> nrf_sdh_ble: Change the RAM start location from 0x20002A98 to 0x20002AC8.
<warning> nrf_sdh_ble: Maximum RAM size for application is 0xD538.
<error> nrf_sdh_ble: sd_ble_enable() returned NRF_ERROR_NO_MEM.
于是将0x20002A98改为0x20002AC8,将RAM由0xD568改为0xD538。
再编译运行,OK了!
其次,完成了上一步,这步就要将编译生成的hex打包成用于升级的zip文件包,如何打包呢?
首先我们先编译dfu 的bootload部分
编译过程中会出现报错:#error "Debug public key not valid for production. Please see https://github.com/NordicSemiconductor/pc-nrfutil/blob/master/README.md to generate it",看
报错就知道这是缺少秘钥造成的,这个故意报错,需要大家添加一个秘钥上去。
解决办法:在编译设置中添加宏:NRF_DFU_DEBUG_VERSION
打开cmd命令行,键入一下指令,没有安装nrfutil.exe的可以安装了再执行这条命令,安装方法问度娘,方法很多。
nrfutil.exe keys generate private.pemnrfutil.exe keys display --key pk --format code private.pem --out_file public_key.c
这样生成的秘钥就保存在 public_key.c中,打开public_key.c。把数组pk复制到报错的位置。
然后将hex文件copy到C:\Python27\Scripts目录下,因为我用的python安装的nrfutil,所以在此目录
在cmd上执行命令
nrfutil pkg generate --hw-version 52 --sd-req 0xAF --application-version 0xff --application nrf52832_xxaa.hex --key-file private.pem nrf52832_xxaa_app.zip
生成包文件nrf52832_xxaa_app.zip。注意这里的--sd-req 0xAF要与你的协议栈版本一致,不然即使能打包成功,在升级的时候
也是会报错的,会提示你是无效的版本,这与上面如果没生成一致的public_key.c一样,升级的时候也会提示错误。
升级包打包好了以后,就是后面的使用nrf toolbox工具升级操作了,这个步骤就不说了,太简单了。
有些地方有省略,但我个人觉得问题不大。