Nordic--nrf52832--DFU(二)Sercure DFU bootloader

 安全DFU是nRF5 SDK v12提供的新DFU引导加载程序。SDKv11及更早版本中的旧引导加载程序现在称为Legacy DFU。安全DFU不与Legacy DFU向后兼容。


  • 准备工作
    1. 最新的nRF5 SDK(最低SDK v12)
    2. 安装了pip的Python。如果你没有Python的pip,请看这里。
    3. 为ARM安装版本4.9-2015-q3-update GCC编译器工具链。
    4. Make也是必需的(使用MinGW,GNU Make或Xcode)Make也是必需的(使用MinGW,GNU Make或Xcode)
    5. nRF5x DK或您自己的nRF5x板nRF5x DK或您自己的nRF5x板
    6. 带有BLE或PC的手机,带有额外的nRF5x DK或Dongle。带有BLE或PC的手机,带有额外的nRF5x DK或Dongle。

步骤A.生成密钥

我们需要一对公钥和私钥来加密签名,以使用ECDSA_P256_SHA256对DFU映像进行签名。

Nordic提供nRFutil工具来生成这些密钥。nRFutil.exe可以在这里从github下载。

或者从python使用获得pip install nrfutil。需要检查更新:pip install nrfutil --upgrade

A1.生成您自己的私钥
输入以下命令行:

nrfutil.exe keys generate private.key

将生成private.key文件。

A2.根据您的私钥生成您的公钥

nrfutil keys display --key pk --format code private.key --out_file public_key.c

获得public_key.c文件后,我们可以转到下一步,构建引导加载程序。

步骤B.构建引导加载程序引导加载程序位于\ examples \ dfu \ bootloader_secure_ble

请注意,有两种方式。有一个_debug周期。如果你想避免版本检查,你可以使用这个_debug版本,我们稍后会介绍它。现在,我们将使用普通的bootloader

B1. 编译uECC库。

引导加载程序需要uECC库来解密签名。uECC是一个外部库,必须从github下载。注意:附带许可证要求。

您必须将库克隆/下载到SDK文件夹:SDKFolder\external\micro-ecc\micro-ecc。它应该如下所示:
在这里插入图片描述

下一步,在内部SDKFolder\external\micro-ecc\选择要用于构建引导加载程序的IDE和编译器。在我的情况下,我选择SDKFolder\external\micro-ecc\nrf52_keil\armgcc并输入make以开始构建uECC。
在这里插入图片描述

B2. 将步骤A2中生成的public_key.c文件复制到您的引导加载程序文件夹或您选择的文件夹中,并将其包含在项目中。删除dfu_public_key.c项目中的虚拟对象,因为它已被public_key.c替换

现在您已准备好构建引导加载程序。

B3. 构建引导加载程序。单击构建。如果您已正确完成步骤B1,B2,则应成功构建引导加载程序。

请注意,每次生成一对新的公钥和私钥时,都需要更新public_key.c文件并重建引导加载程序。

步骤C.生成DFU .zip包

DFU主机需要DFU .zip数据包才能将新映像文件发送到DFU目标。.zip文件包含我们要更新的映像 hex文件,初始化数据和数据包的签名。在本教程的主要部分中,我们只进行应用程序映像更新。有关引导加载程序和软件设备更新,请参阅附录。

C1. 准备应用程序hex文件。构建应用程序并在_build文件夹中找到.hex文件。通常它是nrf52832_xxaa.hex在编译SDK的示例时命名的。将应用程序十六进制闪存,并在没有引导加载程序的情况下验证它是否正常工作

C2. 生成.zip文件。将步骤A1中生成的private.key复制到与.hex应用程序文件相同的文件夹中。

在我的情况下,我使用此脚本生成.zip文件:

nrfutil pkg generate --hw-version 52 --application-version 1 --application nrf52832_xxaa.hex --sd-req 0x98 --key-file private.key app_dfu_package.zip

说明:

  1. –hw-version:默认情况下,这应该与你的芯片匹配。如果使用nRF51芯片,则应使用“51”。如果您想拥有自己的hw-version代码,可以使用在引导加载程序中定义#define NRF_DFU_HW_VERSION your_hw_number

  2. –application-version:默认情况下,应用程序版本的起始编号为0.要能够更新新应用程序,应用程序版本应等于或大于引导加载程序存储的版本。这个案子我用的1。详细了解版本规则。

  3. –sd-req:在我的情况下,我的应用程序使用Softdevice S132 v4.0.2运行。此软设备版本的代码编号为0x98。您可以通过键入找到软设备代码编号nrfutil pkg generate --help。如果它还没有在列表中,您可以使用nRFGo Studio找到代码,只需打开包含软设备的任何板。

  4. –application:告诉nrfutil您要更新应用程序,提供应用程序映像。

步骤D.测试DFU

现在你已经准备好了DFU .zip文件和bootloader,是时候实际做DFU了。

D1. Flash引导程序和软件设备。使用nRFGo Studio或nrfjprog或IDE首先刷新软设备,然后使用bootloder。验证引导加载程序是否以“DFUTarg”开始广播。
在这里插入图片描述

D2. 将刚刚在C2中生成的DFU .zip文件复制到手机或您选择的PC上的文件夹中。

D3. 使用手机或PC上的nRFConnect / nRFToolbox应用程序使用您复制的.zip文件连接和OTA DFU。

D4. 在DFU进程达到100%后验证新应用程序是否运行,例如它使用您在应用程序中设置的名称开始广播。如果你能看到,祝贺你已经完成了第一个Secure OTA DFU!

步骤E.更新新的应用程序固件(可选)

E1. 生成新固件,例如修改广告设备名称或LED指示。

E2. 生成新的DFU .zip包。更新新的应用程序版本(至少等于或高于原始版本)

E3. 将设备切换到DFU模式,执行DFU更新并验证新映像是否正在运

附录1.高级功能

1.组合应用程序,引导加载程序,引导加载程序设置和软件设备映像

引导加载程序使用其引导加载程序设置来检测芯片上是否有闪存的有效应用程序。启动时将执行CRC校验。如果我们只是使用编程器使用引导加载程序刷新应用程序,则引导加载程序将无法检测到有效应用程序已经闪存并且它将进入DFU模式,您的应用程序将无法启动。

只有在成功完成DFU更新后,引导加载程序才会写入引导加载程序设置以标记有效的应用程序。但是在生产中,例如,您可能不希望通过为成千上万的设备执行OTA DFU来安装应用程序,这需要花费大量时间。我们可以手动生成引导加载程序设置并将其与引导加载程序合并,以欺骗引导加载程序接受预先刷新的应用程序。我们可以使用nrfutil生成引导加载程序设置,并使用mergehex.exe工具合并hex文件。如果您不想合并,可以先刷新设置然后刷新引导加载程序。

生成引导加载程序设置的脚本是

nrfutil settings generate --family NRF52 --application yourApplication.hex --application-version 0 --bootloader-version 0 --bl-settings-version 1 bootloader_setting.hex

执行此命令后,将生成bootloader_setting.hex。它包括与您提供的yourApplication.hex匹配的应用程序版本和CRC。这应该用于覆盖引导加载程序中的默认引导加载程序设置。

–bl-settings-version:对于SDK12和SDK13,我们只有相同的bootloader设置版本= 1

–application-version和–bootloader-version:您选择的应用程序和引导加载程序的初始版本。在这种情况下,我选择了0。

–family:设备系列,与您的芯片匹配。如果您有nRF52840,则必须使用NRF52840而不是NRF52。

之后,您可以使用merhex将bootloader与bootloader_setting.hex合并,如果需要,还可以使用应用程序和软件设备。

用法:

mergehex --merge hexfile1.hex hexfile2.hex --output output.hex

注意:如果您的应用程序需要编写UICR,最好使用此合并通过编程器而不是OTA编写应用程序。当您执行OTA DFU时,引导加载程序将不会写入UICR。

在我们有合并的十六进制之后,我们可以使用一个单一的十六进制来刷新多个设备,而不必使用OTA DFU来刷新应用程序。

2.无按钮DFU

进入DFU引导加载程序模式的最简单方法是按住Bootloader按钮(DK上的按钮4)并重置设备。但是您的设备可能没有任何按钮,或者您只是想在没有任何物理接触的情况下将应用程序切换到引导加载程序。如果是这种情况,您需要无按钮DFU,只需告诉应用程序通过BLE数据包切换到引导加载程序。

我们在此文件夹中提供DFU Buttonless示例\examples\ble_peripheral\experimental_ble_app_buttonless_dfu

您可以按照链接了解如何测试它。在这里,我们试着解释它是如何工作的。无耻的例子与正常的应用程序没有什么不同。您仍然需要刷新引导加载程序。在我们开始使用无按钮示例之前,确保引导加载程序在正常应用程序中正常工作非常重要。

它的工作方式非常简单,切换时,我们向保留寄存器GPREGRET写入一个标志(BOOTLOADER_DFU_START = 0xB1),然后我们进行软复位。这是在ble_dfu.c文件中的bootloader_start()中完成的。

由于保留寄存器在复位后保持其值,因此引导加载程序将在复位后启动时检查该值,然后可以进入DFU模式而不是启动正常应用程序。这与我们按住Bootloader按钮并触发重置时相同。

请注意,在SDK v12上,我们写入引导加载程序设置,而不是写入GPREGRET寄存器。我认为写GPREGRET是一种更清洁的方式。

接下来我们发现调用bootloader_start()的时间。

从SDK v13我们引入了DFU无按钮特性。该特征具有指示和写入属性。我们需要做的只是在特性上启用指示并向其写入0x01。无按钮设备将发送指示并等待来自DFU主机的确认。当来自中央的确认到来时,它将调用bootloader_start()(检查ble_dfu.c中的on_hvc()函数)。之后连接将被删除。

在撰写此博客时,experimental_ble_app_buttonless_dfu不会进行任何绑定转发。因此,如果手机和设备之间存在绑定,则可能会遇到问题。请看第4节。债券转发如下。

有一个从Gaute一个伟大的GitHub的教程在这里,您可以按照测试扣子DFU。

3.更新softdevice和bootloader

可以更新软件设备,引导加载程序和应用程序,我们也支持更新这3个图像的组合。但是,并非所有组合都是可能的。

下表总结了对不同组合的支持(来自这里的nrfutil文档)。

CombinationSupportedNote
BootloaderYes
SoftDeviceYesSoftDevice must be of the same Major Version
APPYes
Bootloader + SoftDeviceYes
Bootloader + APPNoCreate two.zip packages instead
Bootloader + SoftDevice + APPYes
SoftDevice + APPYesSoftDvice must be of the same Major Version

以下代码将生成软设备+应用程序组合:

nrfutil pkg generate --hw-version 52 --application-version 1 --application application.hex --sd-req 0x98 --softdevice softdevice.hex --key-file private.key app_dfu_package_softdevice.zip

4.使用无按钮DFU进行绑定转发

在您进入此步骤之前,请确保您已按照附录2中的说明操作了无Button DFU无粘合。此部分基于撰写本文时的最新SDK,即SDK v15.2。在这里查看信息中心的指南。

您需要修改的是:

  • 在bootloader中的sdk_config.h中:

    • 将NRF_DFU_BLE_REQUIRES_BONDS更改为1
    • 将NRF_SDH_BLE_SERVICE_CHANGED更改为1
  • 在ble_app_buttonless_dfu中的sdk_config.h中

    • 将NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS更改为1
    • 检查 NRF_SDH_BLE_SERVICE_CHANGED是否不为1,然后将其设置为1

编译这两个项目。

为刚刚生成的ble_app_buttonless-dfu 生成引导加载程序设置页面。nRF52832的语法应该是:

nrfutil.exe settings generate --family NRF52 --application my_buttonless_app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 setting.hex

我们需要生成引导加载程序设置的原因是,当您在引导加载程序上启用绑定时,引导加载程序将无法在没有任何绑定的情况下工作。因此,当您第一次启动时,如果没有绑定信息,引导程序将无法启动,您无法使用DFU按钮减少应用程序。所以我们需要创建一个bootloader设置,这样我们就可以合并bootloader + bootloader设置+应用程序,并通过SWD一次性闪存。

下一步是合并它们:

mergehex -m bootloader.hex setting.hex -o bootloader_and_setting.hex

mergehex -m nrf52832_xxaa.hex bootloader_and_setting.hex -o app_bootloader_and_setting.hex

之后,您可以刷新app_bootloader_and_setting.hex(在刷新软设备之后)。该设备应该以Nordic_Buttonless开始并宣传。然后,您可以使用nRF Connect应用程序进行测试。观察启用指示时应用程序自动绑定,然后启动DFU时,切换到引导加载程序时切换到引导加载程序模式而不更改地址(+1地址)。然后在绑定连接状态时看到DFU进程正在完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值