艾克姆科技
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
强光手电
飞宇
初建