https://liu-yaohua.github.io

0%

ble

nRF52832 BLE

随着物联网的发展,BLE蓝牙正在被广泛使用,几乎BLE配个安卓app已然成为现在物联网产品的标配,如小米手环,小米智能家居,小米电饭煲,更多的医疗产品。从技术角度看,与stm32嵌入式开发一般,并无大的区别,主要是加蓝牙协议,而不是单纯的单片机。NRF52832是我入门的第一款BLE蓝牙,所以我打算记录下我的学习过程。

nRF52832芯片简介

nRF52832芯片主要特点介绍。

  • 2.4GHz radio,支持多种无线协议,例如BLE,ANT等。
  • 32位 ARM Cortex-M4F 处理器,增强浮点运算能力,可以提供更复杂的算力支持。
  • 512KB程序存储空间和64KB内存空间。
  • 31个GPIO,每个IO均可灵活配置。

芯片功能框图如下图所示:

nRF52832的学习分三块:

  • 基础实验,针对nRF52832芯片硬件外设的示例实验,例如GPIO实验,UART串口实验等。
  • 协议栈实验,针对蓝牙协议栈的示例实验,例如蓝牙从机实验,蓝牙主机实验等。
  • 协议栈高级实验,蓝牙实验的进阶,例如蓝牙主从一体,iBeacon等,更接近真实项目的示例程序。

新建工程

新建工程目录结构如下:

  1. App文件夹:用于存放main.c文件和我们自己编写的应用程序文件。

  2. Project文件夹:

    Config文件夹:用于存放工程配置向导(sdk_config.h)

    mdk5文件夹:用于存放工程文件

    3.doc文件夹:用于存放说明之类的文档

    4.components,integration,modules等:从sdk中拷贝的库文件

驱动led指示灯闪烁

代码相比于stm32要简单一些,更像arduino,直接贴出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "boards.h"

int main(void)
{
//配置用于驱动LED指示灯D1的引脚P0.17为输出
nrf_gpio_cfg_output(LED_1);

while(1)
{
//P0.17输出高电平,D1熄灭
nrf_gpio_pin_set(LED_1);
//软件延时200ms
nrf_delay_ms(200);
//P0.17输出低电平,D1点亮
nrf_gpio_pin_clear(LED_1);
//软件延时200ms
nrf_delay_(200);


}



}

BLE程序

BLE包含两个部分:softdevice+application

  1. softdevice:是蓝牙低功耗中心设备和外围设备协议栈解决方案,softdevice以hex文件提供,源码不对外公开,softdevice提供了api供用户调用,支持最多同时运行20个连接。
  2. application:nordic提供的库和用户编写的程序。

BLE程序下载

下载softdevice的hex文件+应用程序编译后生成的目标文件

裸机程序

  1. 程序结构:只有nordic的库和用户自己编写的程序
  2. 程序下载:只需下载应用程序

nrf52xxx编程算法

nrf52xx编程算法

裸机程序下载流程

裸机程序下载流程

BLE程序下载流程

BLE程序下载流程

全片擦除芯片

只有使用协议栈下载的编程算法才可以实现全片擦除,下载应用程序的编程算法是无法进行全片擦除的

编程算法设置为协议栈编程算法

全片擦除算法

执行flash->earse

如果在裸机程序中执行了全片擦除,擦除完成后,再将编程算法改成应用程序的编程算法。

BLE设备类型

单模设备:只支持蓝牙低功耗(BLE),如nrf52832

双模设备:既支持传统蓝牙也支持蓝牙低功耗

BLE体系结构

BLE包含三个部分:控制器、主机和应用程序

BLE体系结构

链路层:负责广播、扫描、建立和维护连接,以及确保数据包按照正确的方式组织、正确地校验值和加密序列。

BLE广播、扫描和连接事件

通用广播:最常用的广播方式,可以被扫描,接收到连接请求时可以作为从设备进入一个 连接。

1.Profile

Profile可以理解为一种规范,一个标准的通信协议,Profile存在于从机中。蓝牙组织规定了一系列的Profile,例如HID OVER GATT、防丢器、心率计等。每个Profile中会包含多个Service,每个Service代表从机的一种能力。

2.Service

Service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个Service里又包含多个Characteristic特征值。每个具体的Characteristic特征值,才是ble通信的主体。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic,来读取80%这个数据

3.Characteristic

Characteristic特征值,BLE主从机的通信均是通过Characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。

4.UUID

UUID,统一识别码,前面提到的Service和Characteristic,都需要一个唯一的UUID来标识。UUID为128,但是在ble协议栈中,通常使用16位的UUID,也就是两个字节代替,16位UUID可以与128位UUID之间相互转换。

整理一下,每个从机都会有一个叫做profile的东西存在,不管是上面的自定义的simpleProfile,还是标准的防丢器Profile,他们都是由一系列Service组成,然后每个Service又包含了多个Characteristic,主机和从机之间的通信,均是通过Characteristic来实现。