教程汇总
前期的工具安装根据官网教程来,下面从生成钥匙串开始
建议以下代码都在一个dfu文件夹内操作,便于管理
我用的是nRF52832芯片,SDK是17.0.2的版本,softdevice是17.2.0,Windows系统用powershell进行cmd操作
第一步 生成私钥 private key
在dfu文件夹地址内运行代码(后面也是一样的):
nrfutil keys generate private.key
第二步 生成公钥 public key
运行代码:
nrfutil keys display --key pk --format code private.key --out_file public_key.c
第三步 使用bootloader工程生成bootloader.hex
- 工程文件地址: [nRF5 SDK]/examples/dfu/secure_bootloader/…
如果用的是debug的app,则需要使用 dfu/secure_bootloader_debug下的,否则会导致无法仿真 - 打开ses工程之后,用刚刚生成的publi_key.c里的内容替代工程文件内的dfu_public_key.c里的内容
- build solution(或者按F7),之后在output里找到hex文件,改名为bootloader.hex文件,然后复制到dfu文件夹里
第四步 生成app.hex文件
这个应该不用多说,就是咱们自己写的build一下,然后去output里拿hex文件,改成app_v1.hex移动到dfu文件夹里
第五步 生成settings.hex文件
运行代码:
nrfutil settings generate --family NRF52 --application app_v1.hex --application-version 1 --bootloader-version 1
--bl-settings-version 2 settings.hex
成功运行之后的页面应该类似这样:
Note: Generating a DFU settings page with backup page included. This is only required for bootloaders from nRF5 SDK 15.1 and newer.
If you want to skip backup page generation, use --no-backup option.
Generated Bootloader DFU settings .hex file and stored it in: bl_settings.hex
Bootloader DFU Settings:
* File: bl_settings.hex
* Family: nRF52
* Start Address: 0x0007F000
* CRC: 0xF11E7E13
* Settings Version: 0x00000002 (2)
* App Version: 0x00000001 (1)
* Bootloader Version: 0x00000001 (1)
* Bank Layout: 0x00000000
* Current Bank: 0x00000000
* Application Size: 0x000220CC (139468 bytes)
* Application CRC: 0xD2D2371D
* Bank0 Bank Code: 0x00000001
* Softdevice Size: 0x00000000 (0 bytes)
* Boot Validation CRC: 0x530E99B0
* SD Boot Validation Type: 0x00000000 (0)
* App Boot Validation Type: 0x00000001 (1)
第六步 合并所有文件生成烧录hex
运行代码:
mergehex --merge settings.hex bootloader.hex s132_nrf52_7.2.0_softdevice.hex app_v1.hex
--output full_app_v10.hex
成功后显示类似这样:
Parsing input files.
Merging file "settings.hex" into output.
Merging file "bootloader.hex" into output.
Merging file "s132_nrf52_7.2.0_softdevice.hex" into output.
Merging file "app_v10.hex" into output.
Storing merged file.
第七步 生成升级文件包.zip
修改app代码后,从output拿到 app_v2.hex文件,移动到dfu文件夹。
运行代码:
nrfutil pkg generate --hw-version 52 --application-version 2 --application app_v2.hex --sd-req 0x0101 --sd-id 0x0101 --key-file private.key dfu_app_v2.zip
关于sd-req和sd-id的代码,可以从softdevice的release note中找到,我这里用的是s132_nrf52_7.2.0的:
不能用Jlink仿真的解决办法
情况描述
- 用官方提供的buttonless_dfu工程文件下的hex文件(bootloader+setting+softdevice+app)烧录板子之后,可以用Jlink在ses里面进行实时仿真。
- 根据教程生成自己的key pair、bootloader.hex、app.hex、settings.hex,然后一起合成(merge)最终的hex文件,烧录成功。
- 再根据步骤2里的教程生成升级文件包(.zip),用nRF Connect也可以成功DFU。
- 这个时候连接Jlink 发现不能仿真了,烧录app可以成功,但是板子因为无法识别起始地址导致无法正确启动app程序。
解决办法
找了一些文章试了试也不能解决问题,于是Nordic的官方社区提问。通过回复,发现是因为我的app是用debug的设置,而bootloader用的是release版本设置。用bootloader_debug的工程文件再重做一遍步骤2里的教程就没问题了。