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:\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升级的更多相关文章
- nrf51822-提高nordic ble数据发送速率
讲解2点: 为什么 nordic的4.0协议栈中ble只能发送20字节的应用负载数据. 大量数据发送时如何提高发送速率 1:为何上层应用负载每次最多20字节 首先了解 4.0中链路层的包格式如下: P ...
- NORDIC BLE MAC ADDR
一个ble设备,地址可以分成2大类 1.Public Device Address(公共设备地址) 公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址 ...
- NORDIC ble RSSI
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { ret_code_t err_code; sw ...
- BLE空中升级 谈(二)
BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项(续) TI CC2541支持多个硬件,多个软件对它进行空中升级,可以有不同的组合,硬件有 编号 名称 Hex 用法 1 Cc2540 ...
- Android BLE dfu升级
dfu升级适用于nordic nRF51 nRF52 的系统,github上提供了相关升级的库https://github.com/NordicSemiconductor/Android-DFU- ...
- 如何实现蓝牙空中升级BLE OTA
如何实现BLE OTA?什么叫DFU?如何通过UART实现固件升级?又如何通过USB实现固件升级?怎么保证升级的安全性?什么叫双备份(dual bank)DFU?什么叫单备份(single bank) ...
- BLE空中升级 谈(一)
BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项 现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里不谈论它是满足 ...
- NORDIC 烧录BLE协议栈后不能用JLINK仿真bootloader问题及修改方案
问题原因: bootloader的程序区域是0X78000~0X7E000 但是在bootloader程序中定义了0X0FF8与0XFFC位置处的数据,此数据与BLE协议栈冲突,BLE协议栈的flas ...
- [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)
蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...
随机推荐
- Python3之使用@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来简单,但是,没有办法检查参数,导致可以把成绩随便改 >>> class Student(object): ... pass ... ...
- 【RobotFramework-RequestsLibrary】post方法data<empty>为空问题
日志提示data<empty> 只是因为post requset关键字需要data的值为字典格式,上面set variable将data变为了字符串,所以提示程序异常,这一点可以在post ...
- 解决kalilinux:“下列签名无效: KEYEXPIRED 1425567400"
Kali linux由于太长时间未更新,而出现GPG错误 KEYEXPIRED 1425567400.经检查源未出现问题可以解析,deb也不冲突,就是密钥过期了. 解决方式 使用一条命令,添加新的密钥 ...
- 解决安装eclipse时出现"Failed to load JNI shared library"
下午远程帮别人弄了很久的eclipse,安装时老是出现如图的字样 最后在安装配置文件中找到问题所在,这个最新版本的eclipse需要jdk1.8的环境,由于系统的jdk是1.7,版本过低从而导致安装失 ...
- sql语句中,取得schema中的所有表信息及表的定义结构
postgressql下'検索スキーマの中で.全てテーブルselect tablename from pg_tables where schemaname='test' mysql下'検索スキーマの中 ...
- OS选择题练习
一.死锁 1.设系统中有n个进程并发,共同竞争资源X,且每个进程都需要m个X资源,为使该系统不会发生死锁,资源X的数量至少为() A.n*m+1 B.n*m+n C.n*m+1-n D.无法预计 ...
- C/C+面试题一:找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)
已知字符串"aabbbcddddeeffffghijklmnopqrst"编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2) /********************* ...
- 第6章:LeetCode--数组(冒泡排序、快速排序)
11. Container With Most Water class Solution { public: int maxArea(vector<int>& height) { ...
- Django路由配置
Django路由配置系统.视图函数 1.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是 ...
- python读写文件的操作
编程语言中,我们经常会和文件和文件夹打交道,这篇文章主要讲的是Python中,读写文件的常用操作: 一.打开文件 openFile = open('../Files/exampleFile.txt', ...