艾克姆科技 
nRF52840 开发指南-下册 
[基于 Nordic 蓝牙低功耗/802.15.4 Soc-nRF52840] 
 
艾克姆科技飞宇团队 
[2018.12.20] 
官方店铺:https://acmemcu.taobao.com 
官方论坛:http://930ebbs.com   
艾克姆科技原创发布 
本文档技术支持负责人:强光手电 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
[本文档以艾克姆科技 IK-52840DK 开发套件为硬件平台,针对 BLE 开发,从基本概念和
新建 BLE 工程模板开始,一步步讲解蓝牙 BLE 程序框架及功能的实现] 
 
 
目录 
 
2.1. 
2.2. 
2.3. 
2.4. 
2.5. 
2.1. 
2.2. 
2.3. 
2.4. 
2.5. 
2.6. 
第一章:蓝牙 BLE 技术简介 ......................................................................................................... 9 
1.  学习目的 ................................................................................................................................... 9 
2.  蓝牙技术的起源 ....................................................................................................................... 9 
什么是蓝牙低功耗(BLE) ......................................................................................... 9 
蓝牙版本及 4.0 和 BLE 的关系 ............................................................................ 10 
蓝牙的三种标志和设备类型 ................................................................................. 11 
BLE 的体系结构 .................................................................................................... 12 
BLE 广播、扫描和连接事件 ................................................................................ 15 
2.5.1.  广播事件 ......................................................................................................... 15 
2.5.2.  扫描事件 ......................................................................................................... 16 
2.5.3.  连接事件 ......................................................................................................... 16 
Profile、Service  、Characteristic 和 UUID .......................................................... 17 
第二章:新建 BLE 工程模板 ....................................................................................................... 19 
1.  学习目的 ................................................................................................................................. 19 
2.  新建 BLE 工程模板 ............................................................................................................... 19 
规划工程目录 ......................................................................................................... 19 
建立工程存储目录、拷贝库文件 ......................................................................... 20 
新建工程 ................................................................................................................. 20 
添加需要的库文件 ................................................................................................. 24 
添加工程配置向导文件 ......................................................................................... 28 
新建 main.c 文件并添加到工程。 ........................................................................ 28 
3.  配置工程 ................................................................................................................................. 30 
配置“Target”选项卡 ........................................................................................... 30 
配置“Output”选项卡 .......................................................................................... 31 
配置“C/C++”选项卡 .......................................................................................... 32 
配置“Linker”选项卡 .......................................................................................... 33 
配置“Debug”选项卡 .......................................................................................... 34 
4.  协议栈“Target” ..................................................................................................................... 35 
新建协议栈“Target” ............................................................................................. 35 
配置“Output”选项卡 .......................................................................................... 36 
配置“Debug”选项卡 .......................................................................................... 37 
防止协议栈丢失 ..................................................................................................... 39 
第三章:实现 BLE 基本功能 ....................................................................................................... 41 
1.  学习目的 ................................................................................................................................. 41 
2.  实现的功能 ............................................................................................................................. 41 
3.  BLE 程序结构 ........................................................................................................................ 42 
4.  编写代码 ................................................................................................................................. 43 
日志打印 ................................................................................................................. 43 
Log 功能作用 ................................................................................................. 43 
4.1.1. 
4.1.2.  加入 Log ......................................................................................................... 46 
Log 配置(UART 作为输出终端) .............................................................. 47 
4.1.3. 
Log 配置(RTT 作为输出终端) ................................................................. 48 
4.1.4. 
初始化 APP 定时器 ............................................................................................... 52 
3.1. 
3.2. 
3.3. 
3.4. 
3.5. 
4.1. 
4.2. 
4.3. 
4.4. 
2.6. 
4.1. 
4.2. 
 
4.3. 
4.4. 
4.5. 
4.6. 
4.7. 
4.8. 
 
APP 定时器作用 ............................................................................................ 52 
4.2.1. 
4.2.2.  加入 APP 定时器初始化代码........................................................................ 53 
4.2.3.  本节留下的问题 ............................................................................................. 53 
指示灯初始化 ......................................................................................................... 53 
4.3.1.  指示灯作用 ..................................................................................................... 53 
4.3.2.  编写指示灯初始化代码 ................................................................................. 54 
4.3.3.  本节留下的问题 ............................................................................................. 54 
初始化和运行电源管理 ......................................................................................... 54 
BLE 协议栈初始化 ................................................................................................ 56 
4.5.1.  初始化步骤 ..................................................................................................... 56 
4.5.2.  配置低频时钟 ................................................................................................. 61 
BLE 协议栈使能和内存配置 ........................................................................ 64 
4.5.3. 
配置 GAP 参数 ....................................................................................................... 66 
GAP 作用 ........................................................................................................ 66 
4.6.1. 
GAP 角色 ........................................................................................................ 67 
4.6.2. 
GAP 安全模式 ................................................................................................ 69 
4.6.3. 
GAP 服务 ........................................................................................................ 70 
4.6.4. 
4.6.5.  代码编写 ......................................................................................................... 79 
GATT 初始化 ......................................................................................................... 80 
广播初始化 ............................................................................................................. 81 
4.8.1.  配置广播数据和模式 ..................................................................................... 82 
4.8.2.  编写代码 ......................................................................................................... 84 
4.8.3.  本节留下的问题 ............................................................................................. 85 
服务初始化 ............................................................................................................. 86 
4.9.1.  初始化排队写入模块 ..................................................................................... 86 
4.9.2.  本节留下的问题 ............................................................................................. 87 
4.10.  连接参数协商初始化 ............................................................................................. 87 
4.10.1.  连接参数协商 ................................................................................................. 87 
4.10.2.  连接参数协商模块的参数和事件 ................................................................. 88 
4.10.3.  编写代码 ......................................................................................................... 90 
4.11.  启动广播 ................................................................................................................. 92 
4.12.  试验步骤 ................................................................................................................. 92 
第四章:全面掌握广播 ................................................................................................................. 97 
1.  学习目的 ................................................................................................................................. 97 
2.  基本概念和流程 ..................................................................................................................... 97 
3.  广播数据包报文结构 ............................................................................................................. 98 
前导 ......................................................................................................................... 99 
接入地址 ................................................................................................................. 99 
报头 ......................................................................................................................... 99 
长度 ....................................................................................................................... 100 
数据(AdvData) ...................................................................................................... 100 
校验 ....................................................................................................................... 102 
4.  广播可以包含的数据 ........................................................................................................... 103 
5.  设备地址 ............................................................................................................................... 104 
3.1. 
3.2. 
3.3. 
3.4. 
3.5. 
3.6. 
4.9. 
 
6.1. 
6.2. 
7.1. 
7.2. 
5.3. 
5.4. 
5.1. 
5.2. 
 
公共地址 ............................................................................................................... 105 
随机地址 ............................................................................................................... 105 
5.2.1.  随机静态地址 ............................................................................................... 105 
5.2.2.  不可解析私有地址 ....................................................................................... 109 
5.2.3.  可解析私有地址 ........................................................................................... 111 
随机静态地址读写实验 ....................................................................................... 111 
5.3.1.  代码编写 ....................................................................................................... 112 
5.3.2.  实验步骤 ....................................................................................................... 113 
设置私有地址实验 ............................................................................................... 114 
5.4.1.  代码编写 ....................................................................................................... 114 
5.4.2.  实验步骤 ....................................................................................................... 114 
6.  本地设备名称 ....................................................................................................................... 116 
使用本地名称的步骤 ........................................................................................... 116 
广播中加入设备名称实验 ................................................................................... 117 
6.2.1.  代码编写 ....................................................................................................... 118 
6.2.2.  实验步骤 ....................................................................................................... 118 
7.  外观....................................................................................................................................... 121 
加入外观的步骤 ................................................................................................... 121 
广播中加入外观实验 ........................................................................................... 122 
7.2.1.  代码编写 ....................................................................................................... 122 
7.2.2.  实验步骤 ....................................................................................................... 123 
8.  Flags ...................................................................................................................................... 124 
9.  发射功率等级 ....................................................................................................................... 125 
发射功率等级的定义 ........................................................................................... 125 
广播中加入发射功率等级实验 ........................................................................... 126 
9.2.1.  代码编写 ....................................................................................................... 126 
9.2.2.  实验步骤 ....................................................................................................... 126 
服务的 UUID ................................................................................................................ 127 
10.1. 
UUID ..................................................................................................................... 127 
10.2.  加入服务 UUID 的步骤 ....................................................................................... 129 
10.3.  广播中加入 UUID 列表实验 ............................................................................... 131 
10.3.1.  代码编写 ....................................................................................................... 131 
10.3.2.  实验步骤 ....................................................................................................... 132 
服务数据 ....................................................................................................................... 134 
11.1.  服务数据的定义 ................................................................................................... 134 
11.2.  加入服务 UUID 的步骤 ....................................................................................... 134 
11.3.  加入服务数据实验 ............................................................................................... 136 
11.3.1.  代码编写 ....................................................................................................... 136 
11.3.2.  实验步骤 ....................................................................................................... 137 
从设备连接间隔范围 ................................................................................................... 138 
12.1.  从设备连接间隔范围定义 ................................................................................... 138 
12.2.  加入从设备连接间隔范围的步骤 ....................................................................... 139 
12.3.  广播中加入从设备连接间隔范围实验 ............................................................... 140 
12.3.1.  代码编写 ....................................................................................................... 140 
9.1. 
9.2. 
10. 
11. 
12. 
 
13. 
 
12.3.2.  实验步骤 ....................................................................................................... 141 
厂商自定义数据 ........................................................................................................... 142 
13.1.  厂商自定义数据的定义 ....................................................................................... 142 
13.2.  加入厂商自定义数据的步骤 ............................................................................... 143 
13.3.  广播中加入厂商自定义数据实验 ....................................................................... 144 
13.3.1.  代码编写 ....................................................................................................... 144 
13.3.2.  实验步骤 ....................................................................................................... 146 
第五章:创建定时任务 ............................................................................................................... 147 
1.  学习目的 ............................................................................................................................... 147 
2.  APP 定时器 .......................................................................................................................... 147 
3.  使用 APP 定时器 ................................................................................................................. 148 
4.  裸机创建定时任务实验 ....................................................................................................... 152 
4.1.1.  添加需要的文件 ........................................................................................... 152 
4.1.2.  头文件引用和路径设置 ............................................................................... 152 
4.1.3.  工程配置 ....................................................................................................... 153 
4.1.4.  代码编写 ....................................................................................................... 154 
4.1.5.  硬件连接 ....................................................................................................... 158 
4.1.6.  实验步骤 ....................................................................................................... 158 
5.  BLE 应用创建定时任务实验 .............................................................................................. 159 
5.1.1.  代码编写 ....................................................................................................... 159 
5.1.2.  硬件连接 ....................................................................................................... 160 
5.1.3.  实验步骤 ....................................................................................................... 160 
第六章:实现一个标准的 Profile ............................................................................................... 162 
1.  学习目的 ............................................................................................................................... 162 
2.  配置文件、服务和特征 ....................................................................................................... 162 
Profile(配置文件) ................................................................................................. 162 
Service(服务) ........................................................................................................ 163 
Characteristic(特征)  和描述符 ............................................................................ 164 
3.  需求描述 ............................................................................................................................... 166 
角色 ....................................................................................................................... 167 
需求表和依据 ....................................................................................................... 168 
3.2.1.  广播数据 ....................................................................................................... 169 
3.2.2.  广播参数 ....................................................................................................... 169 
3.2.3.  首选连接参数和连接参数协商 ................................................................... 170 
GAP 服务 ...................................................................................................... 170 
3.2.4. 
3.2.5.  包含的服务 ................................................................................................... 171 
3.2.6.  数据传输 ....................................................................................................... 172 
3.2.7.  皮肤接触检测状态更新 ............................................................................... 175 
4.  代码实现 ............................................................................................................................... 175 
新建文件和路径设置 ........................................................................................... 175 
工程配置 ............................................................................................................... 177 
广播数据和广播参数 ........................................................................................... 177 
首选连接参数和连接参数协商 ........................................................................... 179 
GAP 服务 .............................................................................................................. 180 
4.1. 
4.2. 
4.3. 
4.4. 
4.5. 
2.1. 
2.2. 
2.3. 
3.1. 
3.2. 
 
4.7. 
5.1. 
5.2. 
2.1. 
2.2. 
2.3. 
4.6. 
 
添加心率服务 ....................................................................................................... 181 
4.6.1.  声明心率服务结构体 ................................................................................... 181 
声明心率服务初始化结构体 ............................................................... 182 
4.6.1.1. 
定义心率服务实例 ............................................................................... 183 
4.6.1.2. 
初始化心率服务 ................................................................................... 186 
4.6.1.3. 
添加设备信息服务 ............................................................................................... 193 
4.7.1.  定义服务句柄变量 ....................................................................................... 193 
4.7.2.  声明设备信息服务初始化结构体 ............................................................... 193 
4.7.3.  初始化设备信息服务 ................................................................................... 194 
5.  发送数据和传感器接触状态更新 ....................................................................................... 196 
发送心率测量特征通知 ....................................................................................... 196 
传感器接触状态更新 ........................................................................................... 201 
6.  下载验证 ............................................................................................................................... 202 
第七章:实现一个自定义 profile ............................................................................................... 206 
1.  学习目的 ............................................................................................................................... 206 
2.  需求描述 ............................................................................................................................... 206 
功能描述 ............................................................................................................... 206 
生成自定义 UUID ................................................................................................ 206 
需求表 ................................................................................................................... 208 
3.  代码实现 ............................................................................................................................... 209 
新建文件和路径设置 ........................................................................................... 209 
工程配置 ............................................................................................................... 210 
广播数据和广播参数 ........................................................................................... 211 
首选连接参数和连接参数协商 ........................................................................... 213 
GAP 服务 .............................................................................................................. 214 
添加串口透传服务 ............................................................................................... 215 
3.6.1.  声明串口透传服务结构体 ........................................................................... 215 
3.6.2.  声明串口透传服务初始化结构体 ............................................................... 216 
3.6.3.  定义串口透传服务实例 ............................................................................... 216 
3.6.4.  初始化串口透传服务 ................................................................................... 219 
3.6.5.  自定义 UUID 基数添加到 SoftDevice ........................................................ 223 
发送数据 ............................................................................................................... 225 
下载验证 ............................................................................................................... 226 
4.  实现长包传输 ....................................................................................................................... 228 
MTU 交换 ............................................................................................................. 228 
代码实现 ............................................................................................................... 229 
下载验证 ............................................................................................................... 232 
第十一章:固件更新(DFU) ................................................................................................... 234 
1.  学习目的 ............................................................................................................................... 234 
2.  概述....................................................................................................................................... 234 
DFU 功能的重要性 .............................................................................................. 234 
Nordic Secure DFU ............................................................................................... 234 
相关术语、缩略词 ............................................................................................... 235 
3.  需要的工具软件 ................................................................................................................... 235 
3.1. 
3.2. 
3.3. 
3.4. 
3.5. 
3.6. 
2.1. 
2.2. 
2.3. 
3.7. 
3.8. 
4.1. 
4.2. 
4.3. 
 
4.1. 
4.2. 
4.3. 
4.4. 
4.5. 
 
4.  操作步骤(详细版) ................................................................................................................ 236 
安装 gcc-arm-none-eabi ........................................................................................ 236 
安装 MinGW ........................................................................................................ 239 
4.2.1.  安装 ............................................................................................................... 239 
4.2.2.  配置环境变量 ............................................................................................... 241 
4.2.3.  验证安装是否成功。 ................................................................................... 242 
工程中加入 micro-ecc 源码 ................................................................................. 243 
生成 micro_ecc_lib_nrf52.lib ............................................................................... 243 
4.4.1.  生成步骤 ....................................................................................................... 243 
4.4.2.  该步骤问题总结 ........................................................................................... 245 
安装 python-2.7 .................................................................................................... 246 
4.5.1.  安装 ............................................................................................................... 246 
4.5.2.  配置环境变量。 ........................................................................................... 249 
4.5.3.  验证安装是否成功。 ................................................................................... 250 
4.5.4.  该步骤问题总结 ........................................................................................... 251 
安装 pc-nrfutil 和生成 key ................................................................................... 251 
4.6.1.  安装 pc-nrfutil ............................................................................................... 251 
4.6.2.  生成 private key 和 public key ..................................................................... 252 
编译和烧写 Bootloader ........................................................................................ 253 
4.7.1.  编译 Bootloader ............................................................................................ 253 
4.7.2.  烧写 Bootloader ............................................................................................ 254 
升级文件打包 ....................................................................................................... 255 
执行 DFU .............................................................................................................. 256 
4.9.1.  首次无线 DFU .............................................................................................. 256 
4.9.2.  再次无线 DFU .............................................................................................. 258 
5.  代码的烧写和合并 ............................................................................................................... 260 
生成 settings 和代码的分开烧写 ......................................................................... 260 
使用 mergehex 合并烧写 ..................................................................................... 261 
6.  BLE 串口透传中加入 DFU 服务 ........................................................................................ 263 
需要加入的文件和引用的头文件 ....................................................................... 263 
工程配置 ............................................................................................................... 264 
使能 logs ............................................................................................................... 266 
需要增加的代码 ................................................................................................... 267 
该步骤问题总结 ................................................................................................... 271 
参考文献....................................................................................................................................... 272 
 
6.1. 
6.2. 
6.3. 
6.4. 
6.5. 
4.8. 
4.9. 
4.6. 
4.7. 
5.1. 
5.2. 
 
 
 
 
 
修订历史记录 
Revision Records 
日期 
版本 
编制 
审核 
说明 
Date 
Version 
Written By 
Checked By 
Explanation 
2018.12.20 
A 
强光手电 
飞宇 
 
 
 
 
初建