NDK 蓝牙 OTA 移植指南¶
1 概述¶
NDK BLE OTA 功能使用的是开源 DFU 协议(磐启添加了设备相关的适配层),支持通过 NRF Connect App 进行 OTA 固件升级,同时支持 IOS 和安卓版 NRF Connect App。
磐启移植的是 DFU server,如果用户需要将 DFU Client 集成到自己的系统,需要自行处理,可以去 Nordic github 仓库寻找资源。
一个完整的 DFU 功能移植包含2个工作:
DFU 代码移植
工程参数配置(例如:Flash Map 的配置)
2 DFU 代码移植¶
磐启提供了3种 DFU 代码移植方法:
基于支持 OTA demo工程开发
标准移植
快速移植
用户可以在 SDK 的 <home>\nimble\component\dfu
路径下找到 DFU 源码。

DFU 源码文件¶
2.1 基于支持 OTA 的 Demo 工程开发¶
用户可以基于 OTA demo工程(ble_periph_hr_ota)开发项目,这个最简单,用户只需要关注 Flash Map 和 BLE 资源要根据实际需求配置。Flash Map 和 BLE 资源的配置选项可以在工程的sdk_config.h
中找到。
2.2 DFU 标准移植方法¶
Step1: 在 keil 工程中新建
ble_dfu
文件夹(名称可以自己取)新建ble_dfu文件夹¶
Step2: 通过 keil 添加 DFU 源码文件到 ble_dfu 文件夹中
添加DFU源文件¶
Step3: 添加 DFU 头文件到 keil
添加 DFU 头文件¶
Step4: 在 code 中引入 DFU 头文件
pan_smp.h
, 同时在app_ble_pre_init_cb()
函数中添加 DFU 初始化函数pan_dfu_init()
添加 DFU 初始化函数到工程¶
到此, DFU 代码移植完成
2.2 DFU 快速移植方法¶
快速移植方法是在标准移植方法的基础上去掉了新建ble_dfu文件夹和添加DFU 源文件到ble_dfu文件夹以及手动添加 DFU 头文件的步骤,也即去掉了标准移植方法的 step1 和 step2 以及 step3,同时对step 4 略微修改
Step1: 在 SDK
<home>/nimble/scripts/
路径下找到dfu_porting_tool.py
脚本,copy脚本到用户工程目录下,然后执行脚本,脚本将自动添加DFU 头文件到keil工程。(需要安装python)

dfu_porting_tool.py 脚本¶
Step2: 在 code 中引入 DFU 头文件
pan_dfu.h
, 同时在app_ble_pre_init_cb()
函数中添加 DFU 初始化函数pan_dfu_init()

添加 DFU 初始化函数到工程¶
到此,DFU 代码移植完成。
3 工程配置¶
DFU 代码移植完成后,需要根据所使用的芯片 Flash Size 和应用来配置 Flash Layout。Flash Layout 主要包含 bootloader area、image area、image backup area、kv store area 和 user custom area 配置。
Flash layout 的配置选项可以在工程 sdk_config.h
配置文件中中找到。

Flash Layout¶
注意:固件 DFU/OTA 还依赖 Bootloader 和 Image Header,因此 Enable Bootloader 和 Enable App Image Header 两个配置选项必须开启。使能 Image Header 后,还可通过其 App Image Version 子配置来维护固件版本信息。
除了上述配置外,可能还需要配置 RTOS 参数或者 BLE 参数,这个与具体应用有关系,无法给出一个具体配置,这里只是给用户做个提示。
4 DFU 使用注意事项¶
DFU 移植并配置好后,即可通过 keil 编译生成 app image,生成的固件被存储在工程目录下的 Images 文件夹中,需注意这些固件均可以通过 JLink/PANLINK 的方式直接烧录到芯片中,但只有其中带 “signed” 字样的签名固件才可以用于蓝牙 OTA:
Images 文件夹¶
为了使用 DFU 功能,除了烧录 app 固件外,还需使能并烧录 bootloader 固件,关于 bootloader 的介绍请参考 NDK Bootloader 开发指南 文档。