logo资料库

nrf51822协议栈空中升级.pdf

第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
资料共15页,剩余部分请下载后查看
Nrf51822 协议栈和 bootloader 的空中升级 小潘 921537102 本文档为个人学习总结 只作为学习交流用途 欢迎大神指导纠正错误
nrf51822 中的 BLE bootloader 支持更新协议栈、bootloader 和应用程序。这种更新被称 之为 Device Firmware Update。我们可以将新的协议栈、bootloader 或者应用程序通过 Nordic 的 BLE DFU Service 进行空中更新(Over The Air)。 首先我们来看一下存储空间的布局 如图为 nrf51822 256K 的 Flash 分布。协议栈不同,SD size 大小会不一样。这里以 SDK9.0 S110 协议栈为例。协议栈大小为 96k,所以为 0x00018000。 这里 MBR 的功能是,当系统启动时 MBR 会检测 bootloader 地址是否有效,来决定启动 应用程序或者启动 bootloader。 由上图还可以看出,在 Application 区域中有 application、App data 和 DFU bootloader。 Application 即为我们的应用程序的代码。 DFU bootloader 是具有 BLE DFU 功能的 bootloader 代码。 App data 是程序中使用保存的 flash 的数据。
为了安全的执行空中升级,接收到的新的固件不会立即放到最终的位置上去,而是先放 到 flash 中的 Free 空白区中,当确定接收到的固件有效、并通过最终验证的时候,再放到最 终的位置。 做过应用程序升级的朋友都知道,nordic 提供了两种空中升级的方式,分别为 Dual bank 的方式和 Single bank 的方式。
由上面两幅图片我们很明显的知道两种升级方式的区别,dual bank 的升级方式是先将 新的固件放到 flash 中,等待接收完成并确认有效之后,新的固件会将旧的固件替换掉。而 single bank 的升级方式是先直接擦除旧的固件,然后接收完成新的固件就加载新的固件。 dual bank 升级的好处就是当新的升级失败的时候,旧的固件还在 flash 内,还能运行旧 的固件。而 single bank 升级方式的好处就是因为旧的固件在升级之前已经被擦除了,所以 flash 中能够存放更大的固件,但一旦升级失败,flash 内没有旧的应用程序,只能重新升级 了。 今天我们主要实验的是协议栈和 bootloader 的空中升级,bootloader 和协议栈的更新只 能使用 dual bank 的方式,因为如果使用的是 single bank 方式万一升级失败了,那就变砖了(只 能通过 flash 烧写工具重新烧写)。而应用程序 single bank 升级失败的话 bootloader 和协议栈 还在,还可以重新升级。dual bank 升级协议栈和 bootloader 方式如图 升级过程为首先将应用程序 application 擦除(因为如果不擦除的话 flash 空间可能会不够 用),然后将接收到的新的协议栈和新的 bootloader 放到 free 空间,待接收完成且验证通过 后将旧的协议栈和 bootloader 替换掉。 本次实验适用于 SDK7.0 到 SDK11.0,下面以 SDK9.0 为例,使用 S110 的协议栈更新为 S130 的协议栈,并完成 bootloader 的更新。 1、首先还是下载协议栈,S110 的协议栈大小为 96K。
2、将 bootloader 下载进入板子 这里我打开的是 s110 的 bootloader,路径为: \examples\dfu\bootloader\pca10028\dual_bank_ble_s110\arm5_no_packs 由于官方例程使用的都是 32K RAM 版本的芯片,而我使用的是 16K RAM 的芯片,所以读写 存储器的地址做了一些修改。 为了方便区分后面升级的协议栈,这里我将 dfu BLE 的广播名做了一些修改 在 dfu_transport_ble.c 修改广播名称 下载进去之后手机可以扫描到此名称的蓝牙广播,则证明 bootloader 可以使用了,如果没有 蓝牙广播,则要检查一下 bootloader 中代码是否进入到 bootloader_dfu_start()这段程序中。
3、应用程序中添加 DFU 服务,用来无按键进入 bootloader。 可以参考\examples\ble_peripheral\ble_app_hrs\pca10028\s110_with_dfu 的例程, 最简单的方法就是在工程中将带有 BLE_DFU_APP_SUPPORT 这个宏定义的代码全都添加到的 工程中。比如: 这里我直接使用 ble_app_hrs s110_with_dfu 的工程,程序下载进入之后广播名称变为默认名 称。 连接之后可以发现 DFU 服务
4、打包空中升级协议栈的 zip 包 从 SDK7.0 版本开始,在执行空中升级操作的时候,就需要用到 init packet,这个 init pack 实 际上是一个包含程序镜像固件文件和 init 信息 zip 包。这里需要用协议栈的 hex 文件打成 zip 包,方法如下: 找到协议栈的 hex 文件,因为我们要升级成 s130 的协议栈,所以我们找到该协议栈的 hex 文件,默认路径为:\components\softdevice\s130\hex 空中升级需要先安装 zip 打包工具,这里我使用的是 PC Master Control Panel 中的 nrfutil 工具 来进行打包的,将上面的协议栈 hex 文件复制到 MCP 目录下的 nrf 文件夹内 打开 DOS 命令用 nrfutil 打包命令打包,init 包内可以包含的内容有 bootloader 中的 init packet 检查是在 dfu_init_template.c 中。 打包: 在 cmd 下输入 CD+ 然后输入 nrfutil.exe dfu genpkg s130_softdevice.zip --softdevice s130_softdevice.hex --application-version 0xffffffff --dev-revision 0xffff --dev-type 0xffff --sd-req 0xfffe
在该路径下会出现一个 zip 文件,则 zip 打包已经完成了,个别电脑不能完成打包 zip, 则需要以管理员身份运行。这里值得一提的是上面填入了很多 0xffff 和 0xfffe 的意思是支持 任意版本版本和协议栈。 5、使用手机升级工具升级协议栈。 将打包好的 zip 文件放进手机中,这里我使用的是安卓 nrf connect 对其进行升级。 连接上蓝牙,点击右上角 DFU 按钮,选择 ZIP 文件。 然后在该界面下等待升级完成
分享到:
收藏