【BLE】SDK_15.2 nRF52832 蓝牙DFU笔记1
首先,我们需要在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包安装界面,这里需要选择三个项目
然后按照下图从左到右配置环境变量。
如果配置完成可以通过CMD查看到版本,看到版本即证明配置成功。
如果输入指令弹出以下错误,提示缺少文件,需要重新下载libiconv-2.dll文件,然后复制到C:\MinGW\bin即可。
Micro-ecc-master源码添加
下载完micro-ecc-master之后解压到以下路径,并重命名为micro-ecc。 接下来需要生成micro_ecc_lib_nrf52.lib文件,这时需要打开之前安装的MinGW目录。 双击之后会出现一个批处理的文件框,然后CD到对应的路径。这里需要注意一下,win10下的路径是用"\"的,这里需要改成"/",还有复制的路径是有冒号的,比如C:\或者D:\,需要把':'去掉。然后执行make指令。 执行完之后,在之前的路径下会生成一个micro_ecc_lib_nrf52.lib文件,证明生成成功。 如果在使用make指令之后,出现以下情况。 此时需要修改下面路径中的文件,用文本打开即可。 打开之后如下图所示。 修改成跟这个目录下的文件夹名一样即可,然后再次使用make命令生成lib。
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文件。
大家务必保存好私钥,以后进行DFU升级,都会先通过这个私钥对它进行签名。最后将dfu_public_key.c这个文件替换掉官方原有的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。工程中可以查到对应的版本。 nRFgo Studio也能查到。 c. --application-version:如果升级文件包含Bootloader,那么新的image版本必须大于当前版本。如果升级文件(image)只是应用程序,新的image版本号必须大于或等于当前版本。
升级
打开如下工程下载对应的协议栈和boot代码。 下载完之后打开nrfconnect APP即可以看到以下的蓝牙设备。 点击右上角的DFU。 SDK10之后的版本只支持ZIP方式升级,因此这里选择第一项。 然后选中发到手机上的ZIP文件,等待升级完成。 复位之后,就可以看到下图所示的蓝牙设备了,这说明已经升级成功了。 在SDK12后的版本采用非按键式(Buttonless)DFU,即从app应用到bootloader不再需要按键了,只需要通过APP发送切换指令就可以了,具体操作方法如下:首先,连接设备,然后打开Secure DFU Service,先使能指示功能,然后点击写功能。 这时会弹出命令框,选择发送指令。 发送之后蓝牙会自动断开,然后用APP再次扫描,就会发现广播信号名称变成DfuTarg,这个时候就可以进行空中升级了。
生成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文件合并出来的文件。
合并后的hex文件可以通过nRFgo Studio进行烧录。