首先,我们需要在Nordic的官网上面下载SDK地址是:https://developer.nordicsemi.com/nRF5_SDK/nRF5_SDK_v15.x.x/
这里我们下载SDK15.2版本(目前最新的版本是15.3,但是经过我测试发现SDK15.3的空中升级好像有点问题,具体表现是我下载进去之后在nRFgo看不到Bootloader的Region,听大神说15.3不支持nRFgo,所以我把版本退回到SDK15.2)
Nordic的空中升级采用的是Secure DFU,这种升级方式的流程主要是,先通过蓝牙发送开始升级的指令,然后芯片跳转执行Bootloader代码,再在Bootloader中进行升级,需要说明一下的是,单独的Bootloader代码已经是一个完整的代码了,已经有蓝牙广播,蓝牙服务等信息了,就相当于一个完整的APP代码一样。
这种升级方式有优缺点,优点是就算APP代码由于某些原因更新错误,设备也不会变成砖,依旧能再次执行DFU进行升级;缺点是在升级过程中由于执行的是Bootloader代码,此时设备是不执行APP的,如果升级的过程需要1分钟那设备这1分钟都是不能正常运行的,有些设备要求在升级的过程依旧能正常使用,那么这种方式就不太合适了,所以这个需要根据实际应用斟酌一下。
在使用DFU前,我们先配置好一些环境,这个过程需要比较多的工具,这里一一罗列出来:
- gcc-arm-none-eabi编译环境
- MinGW平台;
- Micro-ecc-master;
- Python2.7(这里只能支持Py2本,不支持Py3,但这两个版本可以同时安装在电脑上);
- nrfutil;
- nRFgo Studio;
- nRF Connect App;
GCC编译环境的安装
直接按照上面的网站下载之后双击安装包,按照套路安装就行,路径选择默认的。
MinGW安装
也是点击安装包按照套路安装,路径选择默认的。安装完成之后会弹出Package包安装界面,这里需要选择三个项目






Micro-ecc-master源码添加
下载完micro-ecc-master之后解压到以下路径,并重命名为micro-ecc。








Python环境安装
这个在网上有很多教程,这里就不再多说,提一点就是Python也是需要配置环境变量的,如果有两个版本就需要配置两个版本的环境变量,哪个环境变量排在首位,系统就优先采用哪个版本。

nrfutil安装及使用
这个是python的第三方库,直接在CMD下使用以下命令就可以了。
pip install nrfutil
安装成功的标志。

接下来在喜欢的地方新建一个文件夹,命名为key。之后打开这个文件夹按住shift键+鼠标右键选择打开Powershell窗口,依次输入以下指令。
nrfutil keys generate private.pem
nrfutil keys display --key pk --format code private.pem --out_file dfu_public_key.c
如下提示证明生成成功,此时在这个目录下会生成private.pem和dfu_public_key.c文件。


生成boot.hex
打开如下目录的工程,编译应该不会报错,如果报错,看一下是不是dfu_public_key.c没有替换成功。
编译完成之后在_bulid生成nrf52832_xxaa_s132.hex,重命名为boot.hex,放到之前新建的key文件夹中。
生成app.hex
打开如下目录的工程,编译完成之后在_bulid生成nrf52832_xxaa_s132.hex,重命名为app.hex,放到之前新建的key文件夹中。
打包升级文件
SDK9版本之后,DFU仅支持ZIP升级,因此升级的固件需要做成ZIP格式,这个主要通过nrfutil指令实现。
打开新建的key文件夹,在此处打开Powershell,并输入以下指令。
nrfutil pkg generate --hw-version 52 --sd-req 0xAF --application-version 1 --application app.hex --key-file private.pem app_dfu_package.zip
此时文件夹中会生成一个ZIP文件,将这个文件发送到手机上。

a. --hw-version:硬件版本,如果是52系列设置为52,51系列设置为51
b. --sd-req 0xAF:协议栈(SoftDevice)ID,应输入使用的协议栈版本对应的ID。https://github.com/NordicSemiconductor/pc-nrfutil/blob/master/README.md
该网站上可以查到对应的ID。工程中可以查到对应的版本。


升级
打开如下工程下载对应的协议栈和boot代码。





首先,连接设备,然后打开Secure DFU Service,先使能指示功能,然后点击写功能。


生成Setting.hex文件
在实际开发中,一般都是希望下载后就可以运行到应用程序,而不是需要DFU一次才运行。如果需要实现这种状态,则需要生成setting文件。
在刚才生成的key文件夹中,存放了app.hex文件,在此处打开Powershell窗口,输入以下指令:
nrfutil settings generate --family NRF52 --application app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 app_settings.hex
注意:--application-version 和--bootloader-version 为用户选择的application和bootloader最初的版本,这里我都填1。

合并hex文件
为了进一步简化批量烧录的步骤,我们可以将需要烧录的文件打包,形成一个单独的hex,这里需要用到nrf5x command line tool里的mergehex指令,该指令一次最多可以合并3个hex文件,如果需要合并4个hex文件,需要分两步来进行合并。
- 合并协议栈hex,boot.hex和app.hex
在刚才的key文件夹中,存放了3个hex文件,在此处打开Powershell,然后输入以下命令:
mergehex --merge s132_nrf52_6.1.0_softdevice.hex boot.hex app.hex --output out_temp.hex

说明:s132_nrf52_6.1.0_softdevice.hex为协议栈的hex文件;
boot.hex为boot的hex文件;
app.hex为应用的hex文件;
out_temp.hex 为临时需要输出的hex文件;

继续合并,将out_temp.hex和app_settings.hex合并,指令如下:
mergehex --merge out_temp.hex app_settings.hex --output out_ok.hex
输入命令回车后,生成了out_ok.hex,即是4个hex文件合并出来的文件。


网友评论