NORDIC BLE升级

NRF52832 SDK15.3.0

概述:

所谓DFU(Device Firmware Update),就是设备固件升级的意思,而OTA是DFU的一种类型,准确说,OTA的全称应该是OTA DFU,只不过大家为了方便起见,直接用OTA来指代固件空中升级(有时候大家也将OTA称为FOTA)。DFU除了可以通过无线方式(OTA)进行升级,也可以通过有线方式进行升级,比如通过UART,USB或者SPI通信接口来升级设备固件。

不管采用OTA方式还是有线通信方式,DFU包括后台式(background)和非后台式两种模式,目前的智能手机升级Android或者iOS系统都是采用background DFU方式,即新固件在后台悄悄下载,下载成功后,再提示用户升级,整个升级过程中对用户手机使用没有任何影响。而早先的功能机就是采用非后台式 DFU来升级操作系统的,即用户需要先长按某些按键进入bootloader模式,然后再进行升级,在升级过程中,手机的正常功能无法使用。Background DFU必须采用双备份(dual bank)模式进行升级,即老系统(老固件)和新系统(新固件)各占一块存储区,只有当新系统下载完成并校验成功后才会去升级老系统。而非后台式DFU可以采用dual bank或者single bank模式,dual bank的做法是升级时系统先进入bootloader,然后把新系统(新固件)下载下来并校验成功,然后再擦除老系统(老固件)并升级新系统,dual bank方式虽然牺牲了很多存储空间,但是换来了更好的升级体验。Single bank的做法是升级时系统也是先进入bootloader,然后立马把老系统擦除,然后直接把新系统下载到老系统区域,跟dual bank相比,single bank将大大节省Flash存储区域,在系统资源比较紧张的时候,推荐使用single bank方式。不管是single bank还是dual bank,升级过程出现问题后,都可以进行二次升级,都不会出现“变砖”情况。不过dual bank有一个好处,如果升级过程中出现问题或者新固件有问题,它还可以选择之前的老系统继续执行而不受其影响。而single bank碰到这种情况就只能一直待在bootloader中,然后等待二次或者多次升级,此时设备的正常功能就无法使用了,从用户使用这个角度来说,你也可以认为此时设备已经“变砖”了。可参考下面三个图来理解上述过程

 

 SDK软件架构

Nordic nRF5系列产品都是使用Flash存储器的,确切说,是嵌入式可执行代码的Flash存储器,也就是说,代码是可以直接在上面运行的,这个跟很多其他BLE厂商是不一样的(他们使用的是nand Flash,代码是不能直接在nand Flash中运行的,必须先装载到RAM中才能跑,所以你会发现这些厂商的RAM都非常大)。Nordic Flash是带cache机制的,以保证大部分代码执行速度可以达到64MHz,在cache失败的时候,等待周期也只有1个cycle,可以说Flash的执行速度和效率都是非常不错的。另外,Nordic芯片是纯Flash产品,里面没有其他NVM,所有非易失性数据都放在Flash中,包括蓝牙协议栈,这也是为什么Nordic蓝牙协议栈也可以OTA的根本原因所在。

Nordic nRF5 SDK将芯片的存储器划分成如下格局:

      Flash结构图                                                                                              RAM结构图

nrf52832flash分区:

Nordic OTA分dual bank和single bank,application、协议栈、和bootloader都可以升级

dual bank updates:

 single bank updates:

 

 MBR了解:如果bootloader存在的话,Master Boot Record(MBR)的作用是为了启动bootloader

从上图可知,Flash存储器最下面放的是softdevice(softdevice就是蓝牙协议栈,图中的MBR也属于softdevice的一部分),中间是application,最上面是bootloader(可选,只有需要OTA的时候,才需要下载bootloader)。这里需要特别指出的是,softdevice是以二进制形式提供给大家的,它占据了Flash的一块固定空间,起始地址为0,结束地址为APP_CODE_BASE。softdevice同时占用了RAM的一块固定空间,起始地址为0x20000000,结束地址为APP_RAM_BASE。Softdevice占用的Flash空间是固定不变的,运行时不可调节,也就是说APP_CODE_BASE是一个固定值,而softdevice占用的RAM空间是动态可调的,跟softdevice配置和蓝牙服务的多少有直接关联,所以APP_RAM_BASE一定要根据应用的实际情况进行调整。

这里说明一下, Softdevice不是以库的形式提供给大家,而是以二进制文件(hex文件)的形式提供给大家,这种方式可以带来很多好处。首先二进制形式可以保证蓝牙BQB认证的版本和发布给客户的版本一模一样(因为库形式的版本每次编译都会产生少许差异!)。其次softdevice不需要跟你的应用一起编译或者链接,大大节省调试时间,更主要的是,Softdevice运行在固定的Flash空间中,使用固定的RAM空间,从而与你的应用完全隔离开,实现了真正的模块分离,从而出现问题时,可以迅速定位是协议栈的问题还是应用的问题。再次二进制形式的 Softdevice开启了保护机制,应用代码是不能对其进行访问的,以保证Softdevice的安全性,防止应用代码误访问或者误擦除某些softdevice区域。最后这种多bin形式使得OTA变得非常灵活,你可以只OTA应用,也可以OTA协议栈和bootloader,或者三者同时OTA。

安装环境:

1、gcc-arm-none-eabi编译环境:GCC编译环境( https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads

升级需要micro_ecc_lib_nrf52.lib,需要使用GCC编译器生成

2、MinGW平台(https://sourceforge.net/projects/mingw/files/latest/download?source

用于编译makefile文件,产生micro_ecc_lib_nrf52.lib

3、python(https://www.python.org/downloads/

选择版本在2.7.6~3.0.0之间的版本,用于安装nrfutil工具,nrfutil工具用于产生私匙、公匙以及升级需要的settings信息

4、nrfgo-studio(www.nordicsemi.com)

安装后主要使用"nrfjprog.exe"和"mergehex.exe",用于合并与下载文件

5、nrf connect app

用于手机端蓝牙APP

安装说明:

1、gcc-arm-none-eabi编译环境

 

 2、mingw 平台安装

 安装好后弹出package包安装界面MinGW Installation Manager,按下图所示进行选择

 选择后,点击Installationa Apply Changes

3、python安装,nrfutil安装

双击python-2.7.14.amd64.msi安装,注意使用默认路径,安装过程使用默认插件配置直接一直next

添加环境变量:

 

 打开Windows命令行工具CMD,输入如下命令:pip install nrfutil,等待完成nrfutil的安装。安装后nrfutil.exe在C:Python27Scripts中

安装完成后,在Windows命令行工具输入:nrfutil version,其版本应该在3.2.0以上

对于Windows用户,nrfutil运行需要几个特殊的DLL库,而这几个库有些Windows机器是没有的,如此,可往:https://www.microsoft.com/en-us/download/details.aspx?id=40784下载

生成公匙、私匙对

nrfutil keys generate C:Users·Desktoppriv.pem 产生私匙

nrfutil keys display --key pk --format code C:Users·Desktoppriv.pem --out_file  C:Users·Desktopdfu_public_key.c 产生公匙

生成的 dfu_public_key.c 文件会拷贝到 dfu 文件夹下供 secure_bootloader 使用 

生成micro_ecc_lib_nrf52.lib

执行如下的“build_all.bat”脚本(Windows系统),以生成相应的micro-ecc库(micro-ecc会用来对签名进行验签等安全功能)。请注意,欲成功执行build_all.bat,大家必须先安装好git和gcc编译器

点击后会自动从github上下载micro-ecc

打开MinGW的命令行msys.bat

在批处理框里输入要生成库的gcc算法路径

cd F: RF5_SDK_15.3.0_59ac345externalmicro-ecc rf52hf_keilarmgcc

之后输入make

 出现错误后,按照提示修改gcc的Makefile.windows文件如下(根据下载的gcc-arm-none-eabi编译环境安装路径以及版本修改)

 再次输入make:

 

 至此micro_ecc_lib_nrf52.lib库生成完成

升级包制作:

升级共需要3个文件以及一个私匙

应用程序文件nrf52832_xxaa_app.hex(F: RF5_SDK_15.3.0_59ac345examplesle_peripheralle_app_buttonless_dfupca10040s132arm5_no_packs)

boot程序文件nrf52832_xxaa_bootloader_s132.hex(F: RF5_SDK_15.3.0_59ac345examplesdfusecure_bootloaderpca10040_blearm5_no_packs)

蓝牙协议栈s132_nrf52_6.1.1_softdevice.hex(F: RF5_SDK_15.3.0_59ac345componentssoftdevices132hex)

私钥priv.pem

打开命令行工具,输入:

 生成settings

nrfutil settings generate --family NRF52 --application nrf52832_xxaa_app.hex --application-version 1 --bootloader-version 2 --bl-settings-version 1 settings.hex

合并boot与settings

mergehex.exe --merge nrf52832_xxaa_bootloader_s132.hex settings.hex --output bl_temp.hex

合并bootloader, app and softdevice

 mergehex.exe --merge bl_temp.hex nrf52832_xxaa_app.hex s132_nrf52_6.1.1_softdevice.hex --output whole.hex

最终产生whole.hex就是制作的升级程序,将whole.hex下载到设备中就能升级了

升级

生成ZIP文件,需要用户程序nrf52832_xxaa_new_app.hex以及私匙priv.pem

输入nrfutil.exe pkg generate --application nrf52832_xxaa_new_app.hex --application-version 2 --hw-version 52 --sd-req 0xB7 --key-file priv.pem SDK14_app_s132.zip

产生的ZIP文件为SDK14_app_s132.zip

 打开nRF Connect扫描连接Nordic_Buttonless升级用户程序:

 点击圆圈处

 发送请求,设备将复位并进入bootloader状态

 发送完以后,可以看到名为DFUTARG的设备,说明此时设备进入bootloader 状态。连接蓝牙DfuTarg设备

点击右上角的DFU按钮,选择zip文件,开始升级

 

 等待升级完成

文章参考自:

https://www.cnblogs.com/silencehuan/p/11011716.html

https://blog.csdn.net/jdsnpgxj/article/details/80772727

https://www.cnblogs.com/iini/p/9314246.html

https://blog.csdn.net/seanblog/article/details/100011194

 https://blog.csdn.net/weixin_40204595/article/details/80669501

原文地址:https://www.cnblogs.com/yeshenmeng/p/11730864.html