前面几篇都在介绍Secure DFU,而在SDK 12之前版本的DFU,没有签名,称为Legacy DFU。
Secure DFU是由Legacy DFU发展而来,前面介绍的大多数概念都适用于Legacy DFU,本文做一些补充介绍。
(1)类型
总结一下DFU的类型:
DFU类型 | SDK版本 | 特点 |
---|---|---|
Secure DFU | SDK 12.x + | 带签名校验,Flash占用大,工具支持完善 |
Legacy DFU | SDK 11.x – | 不带签名,Flash占用小,得找很老的工具 |
Open DFU | SDK 15.x + | 仅适用于USB接口,不适用于BLE |
如果使用SDK 11.x,Legacy DFU是一个自然的选择。如果使用较新的SDK,只能选择Secure DFU。
(2)升级包
Legacy DFU生成升级包需要使用nrfutil v0.3版本,而不能使用新版本(新版本已经到达3.x)。
下载安装Master Control Panel(PC版)可以在其安装目录下找到nrfutil v0.3,下载地址为:链接。
nrfutil v0.3的命令行参数与新版本不一样,生成升级包的命令为:
nrfutil dfu genpkg --application app.hex dfu_app.zip
有了升级包就可以利用新版的nrfutil或nRF connect APP进行DFU。
(3)Bootloader Settings
Legacy DFU的Bootloader Settings结构比较简单,仅有一个Flag指示应用程序的有效性。
nrfutil v0.3不能生成bl_settings.hex,新版本的nrfutil生成的bl_settings.hex与Legacy DFU不兼容。
Bootloader Settings中的Flag地址是确定的,因此可以利用nrfjprog向该Flash地址写1,手动修改Flag,命令为:
nrfjprog --family NRF51 --memwr 0x3FC00 --val 1
其中0x3FC00是Bootloader Settings的储存地址,而Flag位于该地址的首字节。
同样,如果通过DFU方式升级固件,Bootloader会自动生成和维护Bootloader Settings。
(4)对比
与Secure DFU相比,Legacy DFU有一些特别的地方:
- Bootloader占用Flash为12 kB,Secure DFU占24 kB
- Bootloader中MTU Size只支持23,无法利用BLE 4.2的特性
- SDK提供了ble_app_hrs_with_dfu作为DFU示例,没有一个专门的DFU示例
- DFU服务不需要检测Bootloader,可以脱离Bootloader运行,当然跳转时会出错
- 待续……
(完)
6 responses to “BLE DFU:Legacy DFU”
你好,本人最近在研究nrf51822,其中有不少问题需要请教,看阁下在蓝牙这方面颇有心得,想讨教。请不吝赐教,谢谢。
请讲
有一个疑惑就是DFU 的app_data_reserve的保留空间大小是包括swap、dm和app_data三者之和吗?当设置了保留区域,用pstorage保存的数据,在DFU升级后还可以继续用和之前一样的id访问而不丢失吗?像MAC地址或者号码这类是要用pstorage保存起来吗,还是存储在UICR,又该如何操作才能DFU而不丢失呢?
all yes. UICR用于保存“只读”信息,比如MAC地址,Flash用于保存“掉电不丢失”的信息,比如用户数据。UICR修改不方便,Flash可以自由擦写。
感谢,还有个疑问就是一个hex文件,而mac地址是唯一而递增的,是否需要先存到flash中,每次都自行修改加1?还是有更好的办法可以直接存到UICR中呢?
先擦芯片,再写UICR:nrfjprog –memwr [addr] –value [val],再烧录Hex,在程序里读取addr并用API设置成BLE Address。