【Brief】很多的产品都支持空中升级,何为空中升级(DFU:Device Firmware Update),其实就是设备进行固件升级,网上有很多的说明和讲解,在这里不进行原理的叙述。我也是最近几个月需要学习和使用这个DFU相关的知识,在这篇“平淡无奇”的文章中就行流程的讲解和制作的过程。
【Choose】nrf52832芯片作为我主要讲解的例子,其他nordic芯片同理;softdevice选用最新的SDK15.2版本;编译软件选用keil MDK;下载工具选nrfgostudio;调试工具和方式:JLink-SWD方式;思维导图绘制工具:X-Mind8。
【1、准备工作】在制作空中升级包之前,需要有几个准备工作;
a、先确定你的程序能够正常且正确运行,编译通过;
b、下载相应的软件进行安装,主要的为:(1)python,一般选择安装3.0以下版本的,常用的为2.7左右版本的;
(2)pc-nrfutil,这个是nrf工具安装,非常重要;
(3)micro-ecc,nordic DFU中使用了micro-ecc来实现ECDSA算法和功能;
(4)MinGW,暂时不需要也可不安装
c、除了上面的工具,还需要通过命令的方式去实现制作过程。
d、免费给大家分享一下我整理的部分软件安装包:
链接:https://pan.baidu.com/s/1NXkyDMb65gswVlFtelHilA
提取码:zduy
【流程】
1、如果每次都输入命令去生成文件,比较麻烦,所以建议自己新建一个文件夹,里面保存自己建的可执行文件(组),即.bat文件,目的在于之后更方便的去使用相关的命令;
2、下面依次简单说明一下命令和执行结果 (注:我在手机上通过nrfconnect操作的截图不放上来,自己动手亲自操作就明白了),只是说一下制作升级包的流程。
a、制作第1个.bat命令文件:nrfutil keys generate priv.pem
nrfutil keys display --key pk --format code --out_file dfu_public_key.c priv.pem
b、制作第2个.bat命令文件 :nrfutil settings generate --family NRF52 --application nrf52832_xxaa_name.hex --application-version number1 --bootloader-version number2 --bl-settings-version number3 settings.hex
c、制作第3个.bat命令文件 :mergehex.exe -m s132_nrf52_6.1.0_softdevice.hex nrf52832_xxaa_name.hex -o sd_and_app.hex
mergehex.exe -m sd_and_app.hex nrf52832_xxaa_s132_name_boot.hex -o sd_and_app_and_boot.hex
mergehex.exe -m sd_and_app_and_boot.hex settings.hex -o name_sd_app_boot_settings_complete.hex
d、制作第4个.bat命令文件 : nrfjprog.exe -f NRF52 --eraseall
nrfjprog.exe --program "name_sd_app_boot_settings_complete.hex" --verify
nrfjprog.exe -f NRF52 --reset
e、制作第5个.bat命令文件 : nrfutil pkg generate --hw-version 52 --sd-req 自定 --application-version 自定 --application nrf52832_xxaa_name.hex --key-file priv.pem NAME.zip
f、制作第6个.bat命令文件 : nrfutil pkg generate --hw-version 52 --sd-req 自定 --application-version 自定 --application nrf52832_xxaa_s132.hex --key-file priv.pem dfu_package.zip
g、制作第7个.bat命令文件 : nrfutil pkg generate --hw-version 52 --sd-req 自定 --application-version 自定 --application sd_and_app.hex --key-file priv.pem name_boot.zip
【过程】上面的命令可以根据自己的项目选用的芯片和SDK版本来进行修改;每一个命令都可以在网上自行查到,但是需要注意不要乱用。谨记:一般情况下,public_key整个项目不管是前中后期都是保持不变的,因为一旦改变,后面会导致已推出的设备将无法使用。
[1]执行第1个.bat文件,目的是创建private 和 public_key,通过.bat文件一步到位:
[2]执行第2个.bat文件,目的在于创建setting文件:
[3]执行第3个.bat文件,目的是合并sd、boot和app文件:
[4]执行第4个.bat文件,目的是烧录[3]合并的.hex文件,这个步骤可以用nrfgostudio来做,想要用命令实现烧录的也可以执行[4]这个步骤,一般用于大量生产产品时,选用合并烧录命令来烧录会有更高的效率,假设单纯是试验,两个办法都是可行的。
[5]执行第5个.bat文件,目的是制作app的升级包,有时候,你不需要升级其他内容,只需要升级application的时候,就单独分出来做一个升级包即可,尤其是后期维护和修改时。、
[6]执行第6个.bat文件,目的是制作boot的升级包,跟[5]的原因类似,也是选择进行升级相应的部分,而不是每次都全部进行升级或者是修改,那样造成的效率是很不高的。
[7]执行第7个.bat文件,目的是制作boot和sd的升级包,这个呢,是为了产品的更新换代,比如说我的应用程序没有什么大问题,bug也很少,但是由于我需要这个产品去支持其他的一些应用,那么在升级app之前,我需要把产品底层的文件和启动文件先给修改并且升级,以方便之后产品的功能更新或是其他的更新。
【小结】其实到这里,制作升级包的工作也就完成了,这些升级包制作完后可以去试验一下;先把打包好的文件存放在手机中,再通过nRFconnect软件尝试进行空中升级,最后查看一下你升级过后的版本号(当然也可以是其他的一些标记来证明空中升级成功)。如果失败,请检查自己的命令参数是否正确(如:sd-req,协议栈ID,不同的协议栈ID号也不相同,所以可以根据nRFgostudio中的提示来进行设置),还有就是确认程序是否支持或开启了dfu的功能。下面分享一张我通过学习稍做归纳总结的一张dfu图:
上图中最后一个命令是帮助命令,如果你觉得什么命令或者不知道怎么去使用nrfutil,那么这个命令可以帮助你去熟悉和使用相应的命令,由于命令描述过多,我仅截个图来给大家参考一下(nrfutil pkg generate --help)。