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等,更接近真实项目的示例程序。
新建工程
新建工程目录结构如下:
App文件夹:用于存放main.c文件和我们自己编写的应用程序文件。
Project文件夹:
Config文件夹:用于存放工程配置向导(sdk_config.h)
mdk5文件夹:用于存放工程文件
3.doc文件夹:用于存放说明之类的文档
4.components,integration,modules等:从sdk中拷贝的库文件
驱动led指示灯闪烁
代码相比于stm32要简单一些,更像arduino,直接贴出:
1 |
|
BLE程序
BLE包含两个部分:softdevice+application
- softdevice:是蓝牙低功耗中心设备和外围设备协议栈解决方案,softdevice以hex文件提供,源码不对外公开,softdevice提供了api供用户调用,支持最多同时运行20个连接。
- application:nordic提供的库和用户编写的程序。
BLE程序下载
下载softdevice的hex文件+应用程序编译后生成的目标文件
裸机程序
- 程序结构:只有nordic的库和用户自己编写的程序
- 程序下载:只需下载应用程序
nrf52xxx编程算法
裸机程序下载流程
BLE程序下载流程
全片擦除芯片
只有使用协议栈下载的编程算法才可以实现全片擦除,下载应用程序的编程算法是无法进行全片擦除的
编程算法设置为协议栈编程算法
执行flash->earse
如果在裸机程序中执行了全片擦除,擦除完成后,再将编程算法改成应用程序的编程算法。
BLE设备类型
单模设备:只支持蓝牙低功耗(BLE),如nrf52832
双模设备:既支持传统蓝牙也支持蓝牙低功耗
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来实现。