NRF52840 BLE OTA
NRF52840 BLE OTA
- 1 . 概述
- 2. nRF5 SDK DFU工作原理
- 2.1 ROM空间规划
- 2.2 BLE OTA流程
- 3. 例程
- 4. 小结
1 . 概述
一般MCU DFU(Device Firmare Update)接口为USB、UART、I2C等有线接口。对于NRF52840这颗MCU来说,通过BLE可以做到无线的DFU,即OTA(over the air) DFU。这里主要试下Nordic官方的BLE OTA例程,看看有没有上面需要特别注意的点。
2. nRF5 SDK DFU工作原理
这里介绍下nRF5 SDK Secure DFU(SoftDevice-S140)工作的原理,即需要加密升级过程。
2.1 ROM空间规划
不同其他家MCU bootloader的放置位置,NRF52系列的Bootloader放置在App的后面,因为前面放置了SoftDevice即协议栈,SoftDevice里面前4K(0x1000)空间放置的是MBR( master boot record) 主引导记录部分,上电后由MBR决定跳转到Bootloader还是SoftDevice里面运行,MBR会读取NRF_UICR->NRFFW[0] 的值,不为0xFFFFFFF时即认为bootloader是有的,所以跳转到NRF_UICR->NRFFW[0]对应的值里运行。所以bootloader工程里会通过编译指令把bootloader起始地址设置到NRF_UICR->NRFFW[0](0x10001014)位置上, 此外bootloader 还会在MBR_BOOTLOADER_ADDR(0x0FF8)地址上写入Bootloader起始地址,在MBR_PARAM_PAGE_ADDR(0x0FFC)地址上也写入MBR Params Page Address。
这里APP是有两块的,就是Double bank架构,每次都运行App bank0里的程序,bootloader先更新App Bank1,等App Bank1更新OK后,再把Bank1里的内容搬移到Bank0,就完成了一次更新。这样架构能保证即使更新失败时也有设备也有正常功能。
Reverse区域可以放置一些不希望被更新掉的App数据
Bootloader(空间占用24K)会判断是否需要跳转到App运行,还是留在bootloader执行升级DFU操作,判断条件如下
- 按键是否按下(GPIO状态)
- 保持寄存器GPREGRET1是否为0xB1
- 上次DFU过程是否还在进行中
- 应用程序校验是否通过
Settings Page放在Flash的最后一个页面,占用一个Flash Page(4K)大小, Settings page目前有2个版本:版本1(SDK15.2及以前版本)和版本2(SDK15.3及以后版本),版本2可以兼容版本1,Bootloader可以根据Settings Page来判断应用程序App是否完整性,来决定是否需要升级,Settings page包含的信息比较多,用得比较多的是:
- 版本信息
- DFU升级过程信息
- Application image的CRC值和大小
- 应用程序的bonding信息
- Init command内容
- application/softdevice的启动校验信息(版本2才有)
Backup Page时Settings Page是的一份备份,内容一致
正常上电流程:MBR(0x0) --> Bootloader(0xF8000) --> SoftDevice(0x1000) --> App Bank0(0x27000)
每个部分都有自己的中断向量表,但所有中断向量都由MBR来进行转发
中断向量表
2.2 BLE OTA流程
正常上电后,系统运行在App中,设备收到DFU指令后,将GPREGRET寄存器赋值0xB1,并触发软复位
软复位后,系统再次进入Bootloader,因为GPREGRET等于0xB1,Bootloader进入DFU模式,等待新固件接收
手机先将init packet发送给设备,设备先做前期检验prevalidation,主要是各种版本校验以及签名验签,校验通过后,更新Settings Page并准备开始数据接收
接收新固件,每接收4kB数据,回复一次CRC校验值,直至整个新固件image接收完毕,如果新固件校验通过(版本1校验CRC值,版本2校验hash值),就会去invalidate(无效化) bank0里面的老固件,更新Settings Page,并再次触发软复位
BootLoader启动后发现有新固件需要activate(激活),此时会去擦掉bank0里面的固件,并把bank1里面的固件拷贝到bank0,然后更新settings page,并再次触发软复位。
BootLoader再次启动后,检查新image的有效性,校验通过后,跳到新的Application去执行代码,更新完成
3. 例程
NRF52840 BLE DFU例程路径: nRF5_SDK_17.1.0_ddde560\examples\dfu\secure_bootloader\pca10056_s140_ble
NRF52840 BLE App例程路径:nRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056
因为当前是加密升级,会需要先生成一对公私钥来进行签名验证,可通过nordic的nrfutil工具来生成。nrfutil.exe下载链接为:https://github.com/NordicSemiconductor/pc-nrfutil/releases,也可以通过Python pip来安装。
私钥生成命令:
- nrfutil keys generate private.pem (private.pem就是私钥,需要保存好)
公钥生成命令:
- nrfutil keys display --key pk --format code private.pem --out_file dfu_public_key.c (dfu_public_key.c就是公钥)
将刚才生成的dfu_public_key.c替换掉nRF5_SDK_17.1.0_ddde560\examples\dfu目录下同名文件。就可以编译bootloader程序生成boot hex文件了。然后编译出两个App程序,App里面改下广播名来区分两个App。
- 需先生成Settings Page部分,settings.hex就为settings page数据
- nrfutil settings generate --family NRF52840 --application nrf52840_xxaa_old.hex --application-version 1 --bootloader-version 1 --bl-settings-version 2 settings.hex
- 合并4个hex成一个大个hex文件, 便于烧录, softdevice hex + app hex + bootloader hex + settings hex
- mergehex --merge nrf52840_xxaa_s140_boot.hex settings.hex --output temp.hex
- mergehex --merge temp.hex nrf52840_xxaa_old.hex s140_nrf52_7.2.0_softdevice.hex --output whole.hex
- 烧录合并完的hex文件到MCU中
- nrfjprog --eraseall -f NRF52
- nrfjprog --program whole.hex --verify -f NRF52
- nrfjprog --reset -f NRF52
- 烧录完现在MCU已经可以跑到App程序中了,接下来利用另一个App hex来生成一个升级zip包,
- nrfutil pkg generate --application nrf52840_xxaa_new.hex --application-version 2 --hw-version 52 --sd-req 0x100 --key-file private.pem SDK17_app_s140.zip
注:–sd-req表示老固件运行在哪个版本softdevice上,这个值一定要跟softdevice相匹配,否则无法升级,各个softdevice版本ID信息可以通过命令“nrfutil pkg generate --help”获得,s140_nrf52_7.2.0_softdevice为0x100
- 将刚才生成的SDK17_app_s140.zip拷到手机上,下载nordic的nRF Connect应用程序,蓝牙连接Nordic_Buttonless设备,点击右上角的DFU按钮来选择zip,选完就可以开始升级了。
4. 小结
利用官方提供的例程是可以轻松的开发出带BLE OTA程序的,除了使用nrfutil工具复杂一点,但全部过完一遍还是比较容易上手的,但像NRF52832使用的加密算法不一样,还需要自己编译micro-ecc算法库,但也是配置好Arm compiler环境就可以轻松编译出来lib文件来使用。还是一句话,越用越熟练。
NRF52840 BLE OTA相关推荐
- 如何实现蓝牙空中升级BLE OTA
如何实现BLE OTA?什么叫DFU?如何通过UART实现固件升级?又如何通过USB实现固件升级?怎么保证升级的安全性?什么叫双备份(dual bank)DFU?什么叫单备份(single bank) ...
- btstack ble ota开发笔记(1)-nordic dfu移植
一.前言 btstack的ble example中暂时没有ota的例程,恰巧之前在nrf52832上使用过nordic的dfu例程,配合手机上的nrf-connect app,体验感觉非常棒(进度条+ ...
- 蓝牙BLE OTA 升级 CRC校验
CRC 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能 ...
- android ble oad,android ble OTA升级(Ti OAD 方案)
1.概念 硬件存储中可存放两个镜像:镜像A和镜像B. 关于双镜像,目前有两种做法: 2.方案一: 一个镜像作为 Load 镜像,一个作为功能. 将镜像B作为主要镜像,而镜像A只是作为升级到镜像B的桥梁 ...
- EFR32如何在应用程序中通过BLE 进行OTA升级
Bluetooth SDK里的soc-empty例程里面包含了一个AppLoader,可以用OTA_DFU(Over The Air -Device Firmware Upgrade)的方式升级应用程 ...
- 如何使用蓝牙实现OTA固件升级
作为一种低成本的近距离无线连接协议,蓝牙在现实生活中的应用非常广泛,各种嵌入式.物联网设备随处可见.基于这一特性,我们今天讲一下如何使用蓝牙实现OTA固件升级. 一.概述 所谓DFU(Device F ...
- java 协议栈_深入浅出讲解低功耗蓝牙(BLE)协议栈
详解BLE连接建立过程 https://www.cnblogs.com/iini/p/8972635.html 详解BLE 空中包格式-兼BLE Link layer协议解析 https://www. ...
- CSR8670学习笔记:OTA升级固件
为了方便大家学习,现与我爱蓝牙网联合推出[QCC300x/CSR867x/QCC30xx/QCC51xx开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单 ...
- 安信可蓝牙模块TB系列实现远程OTA无线升级功能介绍,剖析整个实现原理和代码介绍。
文章目录 一.BLE FOTA简介 二.BLE SLAVE FOTA实现流程 通过手机APP 完成BLE设备的OTA演示 联系我们 一.BLE FOTA简介 BLE SLAVE设备除了有线升级(比如串 ...
- SDK_17.1.0 nrf52832 串口透传(NUS)增加DFU功能OTA
1.环境搭建以及需要的软件见这篇文章:Secure DFU环境搭建_Zoolybo的博客-CSDN博客 2.密钥以及加密算法的方法详见这篇文章:详解蓝牙空中升级(BLE OTA)原理与步骤_Zooly ...
最新文章
- 使用文件给swap增加空间
- 最轻快的人脸检测yoloface
- leetcode算法题--Assign Cookies
- QtCreator添加图片资源
- 让使用MSN就像访问网页一样容易!
- updatechecker.java_Mybatis中出现net.sf.ehcache.util.UpdateChecker.checkForUpdate问题解决方案...
- MCU串行通讯和并行通讯的区别以及UART的理解
- 个人总结OLinux上安装oracle11G Data Guard
- C#验证字符串是否是数字,是否包含中文,是否是邮箱格式,是否是电话格式
- linux 进程 D 状态,Linux 进程的 Uninterruptible sleep(D) 状态
- 银联的支付创新产业基地将落户安徽合肥 投资达80亿
- “你需要TrustedInstaller提供的权限才能对此文件进行更改” 解决方案
- VMware 安装windows XP SP3 镜像下载地址 回忆xp经典
- 世界上最快的计算机-泰坦和天河二号
- 道家王凤仪《五行语录》
- 深度强化学习——DQN
- mysql pga_PGA概述
- UML 类图、类与类之间关系
- IT行业最热门的5大岗位,薪酬都有多高?
- WPF中的TreeView选中指定节点