写在前面
刚开始入门52832的时候对于一个嵌入式主控的OTA功能感觉不到其重要性,当真正开始讲产品投入到实际环境中进行应用时,这是后即刻凸显出OTA功能的主要性,如果产品在软件上出了某些bug,没有OTA功能不能远程升级现场设备固件有时将会导致难以估计的损失。对于52832的智能穿戴设备,串口OTA功能实现意义不大,主要是通过官方空中OTA实现对设备进行升级固件。但是如果是一款搭载52832的嵌入式物联网设备,空中OTA缺点是显而易见的,不能实现远程对设备进行升级。但是如果使用设备上其它MCU对52832通过串口进行空中升级,其问题即可得到解决。笔者已实现通过远程对控制设备中的MCU对52832进行升级。其主要实现流程为:让设备连接上服务器,服务器上接收服务器本机串口升级数据,转发到控制MCU,控制MCU再转发给52832,逆向数据也一样的原理,除了数据方向变化其它都是数据转发处理。
实现52832串口远程升级的关键主要是首先验证本地串口升级功能,主要实现过程如下:
主要参考文档
PS:该文档下载所需积分较贵,但文章确实写的很好,适合入门级别,也可到各大BLE群聊搜索下载。
一、搭建环境
文章中搭建环境需要的安装包
52832官方OTA功能主要是用python脚本语言实现,使用时只需要调用CMD命令行窗口即可。
首先安装Python,建议使用python-2.7,这也是官方推荐python版本,安装python过程也很简单,可自行百度。安装python完成后,接下来是使用 Python 来安装 nrfutil,下载 nrfutil 的相关文件,解压压缩包并打开有 setup.py 文件的目录,在此处打开 dos 命令(shift+右键打开)输入命令行 python setup.py install 进行nrfutil安装。输入 python setup.py install 这步骤需要有网络的时候运行,安装可能需要等待几分钟时间。中途遇到过的问题:下载pc-nrfutil-3.3.2版本并安装,但是总是报错,
参考解决如下
二、生成密匙
密匙是用于打包升级固件时候使用,作用是掌握该秘钥的人才能对设备进行升级。生成方法也很简单,在一个新建文件夹下打开cmd窗口,在 cmd 命令中输入以下内容:nrfutil.exe keys generate d:\cc_test\private.key即生成密匙 .key文件,该文件用于打包升级固件时使用。接下来在 cmd 中输入:nrfutil keys display --key pk --format code d:\cc_test\private.key --out_file d:\cc_test\public_key.c 即生成密匙 .c 文件,该文件主要是用于编译bootloder使用,bootloder用于生成初次烧录文件。
三、编译bootloder
编译bootloder需要将文件夹下的密匙替换为自己的密匙,将步骤二中的 .c 文件改名为 dfu_public_key.c ,将
SDK bootloder路径 \examples\dfu\experimental_bootloader_secure_serial\pca10040_debug 打开工程,初次编译会报错;
处理方法:
1、将下载的一个叫micro-ecc-master文件夹下的四个文件拷贝到报错的路径…\components\libraries\crypto\backend\micro_ecc下
2、然后运行external\micro-ecc目录下的批处理
完成上述两步之后编译通过。
然后是修改bootloder波特率为9600,在sdk_config文件中修改对应波特率,远程升级固件建议使用9600更稳定。
最后生成bootloder的hex文件。
四、修改python脚本
这步主要是实现波特率和bootloder中的一直,修改方法很简单,如下图打开参考nrfutil路径下dfu_transport_serial.py文件如下截图:
修改参数如下(主要是修改波特率和流控 还有下方timeout时间,这个timeout时间是关键,是控制等待远程返回数据的时间,我自己的这套环境使用的是20(PS:下图未修改)):
然后在pc-nrfutil-master文件下cmd
执行python setup.py build
和python setup.py install 即可。
五、打包固件
固件主要有两部分,初次烧录固件和升级固件两部分。初次烧录固件用于初次烧录,升级固件用于后续升级。
①、烧录固件打包。
需要的文件:
applaction.hex 这个文件为应用程序编译出来的hex文件
bootloader.hex 这个文件为串口bootloder编译生成的hex文件
softdevice.hex 协议栈hex文件
nrfutil.exe nrfutil工具
将这四个文件放在一个文件夹下,新建一个批处理:
del output3to1.hex
mergehex --merge softdevice.hex bootloader.hex application.hex --output output3to1.hex
del bootloader_setting.hex
nrfutil settings generate --family NRF52 --application application.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 bootloader_setting.hex
del Application_xxxx.hex
mergehex --merge output3to1.hex bootloader_setting.hex --output Application_xxxx.hex
运行批处理生成的Application_xxxx.hex 为最终需要烧录的hex文件
效果如下:
②、烧录固件打包。
需要的文件:
applaction.hex 这个文件为应用程序编译出来的hex文件
private.key 秘钥 .key 文件
nrfutil.exe nrfutil工具
将这三个文件放在一个文件夹下,新建一个批处理:
del Application.zip
nrfutil pkg generate --hw-version 52 --sd-req 0x98 --application-version 31 --application application.hex --key-file private.key Application.zip
运行批处理生成的 Application.zip 为最终需要烧录的zip文件
六、烧录固件
需要的文件:
Application_xxxx.hex 五中打包好的烧录固件
nrfutil.exe nrfutil工具
将这二个文件放在一个文件夹下,新建一个批处理:
nrfjprog -f NRF52 --eraseall
nrfjprog -f NRF52 --program “Application_xxxx.hex” --verify
nrfjprog -f NRF52 --reset
PS:烧录前检查硬件连接,Jlink驱动安装正常与否
运行批处理等待烧录完成
七、升级固件
需要的文件:
Application.zip 五中打包好的升级固件
nrfutil.exe nrfutil工具
将这二个文件放在一个文件夹下,新建一个批处理:
nrfutil dfu serial –pkg app.zip –p COM7 –fc 0 –b 9600
PS:串口COM根据自己连接选择,升级必须先进入DFU模式,进入DFU模式代码:
uint32_t bootloader_start(void)
{
uint32_t err_code;
err_code = sd_power_gpregret_clr(0, 0xffffffff);
VERIFY_SUCCESS(err_code);
err_code = sd_power_gpregret_set(0, BOOTLOADER_DFU_START);
VERIFY_SUCCESS(err_code);
err_code = sd_softdevice_disable();
VERIFY_SUCCESS(err_code);
err_code = sd_softdevice_vector_table_base_set(NRF_UICR->NRFFW[0]);
VERIFY_SUCCESS(err_code);
NVIC_ClearPendingIRQ(SWI2_IRQn);
interrupts_disable();
NVIC_SystemReset();
return NRF_SUCCESS;
}
进入DFU模式后连接硬件串口到PC