nordic DFU一文解决所有问题<一>

最近有需求, 要对nordic52832的sdk进行升级, 升级到SDK17.1, 基本是最新的版本了. 因为之前版本是没有buttonless dfu功能的, 所以折腾了一番, 以下是总结, 尽量长话短说, 因为内容实在有点杂, 看不懂的话… .额… 加入美团吧…

首先, 要实现nordic的buttonless dfu, 需要以下软件:
Keil for windows
nRF connect for desktop for windows
在这里插入图片描述
nrfutils python版本, 建议下载conda, 然后设置虚拟环境python版本为3.7, 然后使用pip直接安装就行(conda/pip/python之类的相关知识, google一下就好).
在这里插入图片描述
手机端下载一个nordic nRF Connect, 可以去google play下载, 大部分应用市场里面根本没有这个APP, 你需要装一个google play的插件(APK downloader), 就可以直接从google play上面下载APK了

首先, 说一下, dfu, bootloader这套东西并不复杂, 只是资料不多, 而且有点七拼八凑, 让人摸不着头脑, 而且用过一次也很容易忘, 我一共折腾过三次, 看了一下我的网易云笔记, 从前年折腾一回, 去年折腾一回, 今年又重新折腾, 所以…
先看一遍这个大佬的文章, 多半是nordic原厂FAE, 或者agent的FAE:
https://blog.csdn.net/m0_37621078/article/details/115541552

名词解释一下:
DFU: 全称Device Firmware Update, 其实包括了OTA, ota是空中升级, 即通过蓝牙来传输要升级的固件, 还有个路子是用串口来升级, 比较常见的就是很多没有WiFi, 蓝牙的MCU要升级, 就要用串口, 比如stm32之类.

bootloader: 如你所知, bootloader是用来衔接MBR跟APP层的, nordic 52832的17.1的SDK所使用的bootloader, 叫做secure_bootloader, 对应的open_bootloader是nordic不能用的,不用管它.

在这里插入图片描述
bootloader就是个应用程序, 它也是一个APP, 甚至也需要蓝牙协议栈的支持, 这里我简单说说52832的启动过程跟顺序, 听个大概就好, 别较真:

首先, 系统上电之后, 芯片会根据MBR跟某个寄存器的值, 来判断你的flash里面有没有bootloader, 具体的位置别较真, 我就这么一说, 你就这么一听就好, 总之, 如果有bootloader, 系统就会从bootloader启动, 不然就从APP所在的flash起始位置(0x26000)启动, 这个不难理解吧.
看一眼APP的Keil的设置, ROM的起始位置就是0x26000
在这里插入图片描述

当你使用nRF connect 的Programer打开你的APP的hex文件, 往芯片里面灌的时候也可以看到flash的地址信息:
在这里插入图片描述
同样的道理, 你用keil打开secure bootloader的flash配置, 就知道bootloader的flash起始位置:
在这里插入图片描述
在这里插入图片描述
所以记住一点, 有bootloader的时候, 系统就会从bootloader启动, bootloader会检查当前的状态:

如果是正常启动, 就先检查APP固件的合法性, 合法就启动APP, 如果不合法, 就会重启或者停留在bootloader, 这个时候表现为你一直会看到一个叫Dfu_Targ的蓝牙在广播.
如果之前利用手机APP让系统重启, 进入bootloader的情况下, APP就需要写入升级的APP, 同样bootloader就会利用公钥对APP的压缩包里的内容进行解密, 合法的情况下, 才会更新固件, 更新的方法, 就是两个flash的区域交替写入之类, 这个不重要.
因为进行了加密解密, 所以叫做secure bootloader. 公钥私钥的使用, 后面再说.

另外再提一嘴, 上面图中黄色的部分是MBR, 就是主引导扇区, 跟windows/linux磁盘里面的那个东西差不多. 稍微上面一点的蓝紫色的部分是SD部分. 记住, 系统不是从SD启动的, SD是APP/bootloader启动之后, 加载到内存中的, 启动跟SD一毛钱关系都没有.

最上面灰色部分是bootloader的配置, 术语叫做bl-settings, 两个page记录, 作为备份用.

OK, 了解了bootloader, app, sd之间的关系了么?, 再重复一遍, 系统先进bootloader, bootloader校验app是否合法, 合法就启动, 不合法就停在那, 等手机APP去升级. 进入app之后, app利用sd, 其各种自己需要的service, 实现蓝牙业务, 同时会有一个蓝牙的dfu service, 当手机APP往这个service中的char里面写入一个值的时候, app就会重启, 进入bootloader, bootloader就会起dfu的蓝牙service, 用于接受固件, 这就是一个循环, 不明白就多看几遍, 感觉说得还算清楚了.
在这里插入图片描述
比如我这个蓝牙从机里面有若干的service实现业务功能, 最后一个service就是用来dfu的.

APP连接后, 就通过这个service, 重启固件的app, 进入bootloader, 好吧, 我有点啰嗦了.

在这里插入图片描述
观察MAC地址发现个细节, 当你重启后, DFT_TARG的mac地址是app的MAC地址+1.
首先传输Zip文件, 然后校验合法性之后就重写app的flash, 在重启就ok了.

下一节说说怎么生成这些文件.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值