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:\Python27\Scripts中

安装完成后,在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\·\Desktop\priv.pem 产生私匙

nrfutil keys display --key pk --format code C:\Users\·\Desktop\priv.pem --out_file  C:\Users\·\Desktop\dfu_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:\nRF5_SDK_15.3.0_59ac345\external\micro-ecc\nrf52hf_keil\armgcc

之后输入make

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

再次输入make:

至此micro_ecc_lib_nrf52.lib库生成完成

升级包制作:

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

应用程序文件nrf52832_xxaa_app.hex(F:\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs)

boot程序文件nrf52832_xxaa_bootloader_s132.hex(F:\nRF5_SDK_15.3.0_59ac345\examples\dfu\secure_bootloader\pca10040_ble\arm5_no_packs)

蓝牙协议栈s132_nrf52_6.1.1_softdevice.hex(F:\nRF5_SDK_15.3.0_59ac345\components\softdevice\s132\hex)

私钥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

NORDIC BLE升级的更多相关文章

  1. nrf51822-提高nordic ble数据发送速率

    讲解2点: 为什么 nordic的4.0协议栈中ble只能发送20字节的应用负载数据. 大量数据发送时如何提高发送速率 1:为何上层应用负载每次最多20字节 首先了解 4.0中链路层的包格式如下: P ...

  2. NORDIC BLE MAC ADDR

      一个ble设备,地址可以分成2大类 1.Public Device Address(公共设备地址) 公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址 ...

  3. NORDIC ble RSSI

    static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { ret_code_t err_code; sw ...

  4. BLE空中升级 谈(二)

    BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项(续) TI CC2541支持多个硬件,多个软件对它进行空中升级,可以有不同的组合,硬件有 编号 名称 Hex 用法 1 Cc2540 ...

  5. Android BLE dfu升级

    dfu升级适用于nordic  nRF51  nRF52 的系统,github上提供了相关升级的库https://github.com/NordicSemiconductor/Android-DFU- ...

  6. 如何实现蓝牙空中升级BLE OTA

    如何实现BLE OTA?什么叫DFU?如何通过UART实现固件升级?又如何通过USB实现固件升级?怎么保证升级的安全性?什么叫双备份(dual bank)DFU?什么叫单备份(single bank) ...

  7. BLE空中升级 谈(一)

    BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项 现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里不谈论它是满足 ...

  8. NORDIC 烧录BLE协议栈后不能用JLINK仿真bootloader问题及修改方案

    问题原因: bootloader的程序区域是0X78000~0X7E000 但是在bootloader程序中定义了0X0FF8与0XFFC位置处的数据,此数据与BLE协议栈冲突,BLE协议栈的flas ...

  9. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

随机推荐

  1. 【Leetcode_easy】657. Robot Return to Origin

    problem 657. Robot Return to Origin 题意: solution1: class Solution { public: bool judgeCircle(string ...

  2. Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  3. 查看某个进程PID对应的文件句柄数量,查看某个进程当前使用的文件句柄数量

    ================================ 1.linux所有句柄查询 lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more ...

  4. python 创建虚拟环境(virtualenv)

    原文地址:https://www.jianshu.com/p/2645d8f2e690 另附连接:Linux环境下虚拟环境virtualenv安装和使用 virtualenv 安装 1.Install ...

  5. idea多级目录与单级目录切换

  6. gcc 与g++的区别

    原文 http://www.cnblogs.com/wb118115/p/5969775.html 什么是gcc / g++ 首先说明:gcc 和 GCC 是两个不同的东西 GCC:GNU Compi ...

  7. java源码 -- TreeMap

    简介 TreeMap 是一个有序的key-value集合,它是通过红黑树实现的.TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合.TreeMap 实现了N ...

  8. python基础学习记录......

    1.IDEA写python 打开IDEA,File--->settings---->Plugins    输入python  安装   重启IDEA 2.新建Project     选择P ...

  9. 串口调试助手--Qt

    串口调试助手----------该程序使用Qt框架,C ++语言编译而成 项目文件介绍: main.cpp 该文件为该程序的入口程序 mainwindow.h 该文件为该程序的主要声明部分 mainw ...

  10. VMware安装windows7系统

    1.进入VMware系统,选择创建新的虚拟机 2.进入安装页面,选择自定义安装 3.选择虚拟机硬件兼容性,选择与自己软件相匹配的硬件兼容性 4.选择下一步后,选择稍后安装操作系统 5.选择客户机操作系 ...