【Nordic】nRF52810 OTA升级(三)–DFU理论分析

相关文章

1.《【Nordic】nRF52810 OTA升级(一)–DFU环境搭建》
2.《【Nordic】nRF52810 OTA升级(二)–DFU如何使用》
3.《【Nordic】nRF52810 OTA升级(三)–DFU理论分析》

1.烧录bootloader+softdevice+application后无法进入application

直接烧录softdevicebootloaderapplication,会发现application并未运行,芯片一直跑在Bootloader中。

芯片启动后先进入Bootloader,检测Bootloader Settings中的数据,如果这些数据指示Flash中有一个有效的Application,则跳转进入Application。Bootloader Settings是Flash中的一段区域,它包含了Application的大小CRC等数据,执行DFU时也会在这里存储状态信息。

正常执行DFU时,Bootloader自动生成和维护Bootloader Settings信息。而烧录过程不同,需要手动写入。可以根据application.hex生成一个bootloader_setting.hex,以产生这些数据,然后烧录这个hex。

生成bootloader_setting.hex的命令为:
nrfutil settings generate --family NRF52810 --application nrf52810_xxaa.hex --application-version 0 --bootloader-version 0 --bl-settings-version 1 bootloader_setting.hex
在这里插入图片描述

2.Memory如何分布

在向设备添加bootloader程序时,必须了解不同的固件组件在设备内存中的位置。下表显示了当前SoftDevice中不同芯片的内存布局:

Usage Memory range nRF52832 (S132 v7.0.x) Memory range nRF52840 (S140 v7.0.x) Memory range nRF52810 (S112 v7.0.x) Memory range nRF52833 (S113 v7.0.x) Memory range nRF52833 (S140 v7.0.x)
Bootloader settings 0x0007 F000 - 0x0008 0000 (4 kB) 0x000F F000 - 0x0010 0000 (4 kB) 0x0002 F000 - 0x0003 0000 (4 kB) 0x0007 F000 - 0x0008 0000 (4 kB) 0x0007 F000 - 0x0008 0000 (4 kB)
MBR parameter storage 0x0007 E000 - 0x0007 F000 (4 kB) 0x000F E000 - 0x000F F000 (4 kB) 0x0002 E000 - 0x0002 F000 (4 kB) 0x0007 E000 - 0x0007 F000 (4 kB) 0x0007 E000 - 0x0007 F000 (4 kB)
Bootloader 0x0007 8000 - 0x0007 E000 (24 kB) 0x000F 8000 - 0x000F E000 (24 kB) 0x0002 8000 - 0x0002 E000 (24 kB) 0x0007 8000 - 0x0007 E000 (24 kB) 0x0007 8000 - 0x0007 E000 (24 kB)
Application area (incl. free space) 0x0002 6000 - 0x0007 8000 (328 kB) 0x0002 7000 - 0x000F 8000 (836 kB) 0x0001 9000 - 0x0002 8000 (60 kB) 0x0001 C000 - 0x0007 8000 (368 kB) 0x0002 6000 - 0x0007 8000 (328 kB)
SoftDevice 0x0000 1000 - 0x0002 6000 (148 kB) 0x0000 1000 - 0x0002 7000 (152 kB) 0x0000 1000 - 0x0001 9000 (96 kB) 0x0000 1000 - 0x0001 C000 (112 kB) 0x0000 1000 - 0x0002 6000 (148 kB)
Master Boot Record (MBR) 0x0000 0000 - 0x0000 1000 (4 kB) 0x0000 0000 - 0x0000 1000 (4 kB) 0x0000 0000 - 0x0000 1000 (4 kB) 0x0000 0000 - 0x0000 1000 (4 kB) 0x0000 0000 - 0x0000 1000 (4 kB)

nRF52设备的默认内存布局如下图所示,其中nRF52832的flash大小为512 kB, nRF52840的flash大小为1024 kB, nRF52810的flash大小为192 kB, nRF52833的flash大小为512 kB:
在这里插入图片描述

3.Dual-bank进行OTA升级

dual-bank更新期间,现有的application将被保留,直到新的固件被激活。如果固件更新过程失败,您仍然可以重新启动设备以启动现有的application

SoftDevice的末端和application的开始之间的存储器区域被分为两个Banks。Bank 0 保存现有的applicationBank 1用于存储接收新的固件。

  • 同时更新SoftDevice和bootloader
    下图显示了bootloader程序和SoftDevice组合image的DFU过程。如果传输的image只包含一个SoftDevice或一个bootloader程序,一般过程是相同的,但只有SoftDevicebootloader程序被替换。
    在这里插入图片描述
  • 更新Application
    dual-bank OTA升级中更新application时,现有的application将被保留。
    在这里插入图片描述

4.Single-bank进行OTA升级

Single-bank OTA升级中,现有的application将被新的固件取代。如果发生错误,设备没有有效的application,系统将恢复到DFU模式,您可以重新启动更新进程。

DFU bootloader检查是否有可能进行dual-bank OTA升级更新。只有当它因为空闲内存不足时,它才会恢复为Single-bank OTA升级。

  • 同时更新SoftDevice和bootloader
    如下图所示为single-bank模式下应用的DFU流程。
    在这里插入图片描述
  • 更新Application
    如下图所示为single-bank模式下应用的DFU流程。
    在这里插入图片描述

5.使用nrfutil创建固件升级包

使用nrfutil工具(版本为2.2.0或更高版本)创建包含firmware image(或多个image)和相应的init package的zip文件。该工具可以作为一个独立的Python包从Nordic Semiconductor nrfutil GitHub中获得,也可以使用pip install nrfutil从pypi中安装。运行nrfutil pkg generate --help显示关于创建zip文件的帮助。

你可以添加binhex格式的固件镜像到zip文件中:

  • --application image: 一个application镜像
  • --bootloader image: 一个bootloader镜像
  • --softdevice image: 一个SoftDevice镜像

你还可以将多个image组合到一个zip文件中。注意,根据image的组合,创建的zip文件可能包含两个固件包(一个bootloader和/或者SoftDevice,另一个application),DFU过程将分两个步骤执行。如果在固件包中同时包含一个bootloader和一个SoftDevice,那么这两个image将被合并在一起。然而,application总是在其他更新完成后单独更新。

除了image之外,还指定要添加到init包中的信息。以下选项可供选择:

Option Example value Description
--debug-mode n/a 添加此标志以跳过版本验证。
--key-file file D:\key\private.key 一个私有(签名)密钥,用于对固件镜像进行加密签名。
--application-version version 0xff application image的版本号。
--bootloader-version version 0xff bootloader image的版本号.
--hw-version version 52 应该接受image的硬件版本。
--sd-req sd_list 0x87,0x8C,0xAE,0xAF,0xB0 SoftDevice的FWID值, 可以运行 nrfutil pkg generate --help显示可能值的列表。

例子如下:制作 OTA升级包
nrfutil pkg generate --hw-version 52 --application-version 1 --application nrf52810_xxaa.hex --sd-req 0x0103 --key-file D:\key\private.key dfufile.zip
在这里插入图片描述

6.SoftDevice性能说明

在Nordic官网下载的SoftDevice包s112_nrf52_7.2.0.zip中,《s112_nrf52_7.2.0_release-notes.pdf》文档里面有说明,如下:
在这里插入图片描述

  • 这个SoftDevice版本兼容nRF52805nRF52810nRF52811nRF52832
  • 这个SoftDevice包含Master Boot Record(MBR)版本2.4.1 (DRGN-10680)。
    • 此MBR版本与以前的MBR版本兼容。
  • 这个版本对MBR和SoftDevice内存的组合要求如下:
    • Flash: 100.0kB (0x19000 bytes)
    • RAM: 3.7kB (0xeb8 bytes). 这是所需的最小内存。
    • Call stack: SoftDeviceapplication相结合的调用堆栈。对于SoftDevice说,最坏情况下的堆栈使用应该确保是1.75 kB(0x700字节)。编写应用程序时确保预留足够的堆栈空间,规避最坏情况下的SoftDevice可以调用堆栈以及最坏情况下的application可以调用堆栈。
  • SoftDevice的Firmware ID为0x0103

猜你喜欢

转载自blog.csdn.net/ZHONGCAI0901/article/details/112345819
今日推荐