
01引言 STM32WB55是一款支持BLE5.x的双核高性能MCU,针对BLE的应用固件包STM32Cube_FW_WB_V1.xx.xx\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE里面也提供了大量的例程,目前支持的标准GAP服务例程在STM32CubeMX中已有列出,或可以在固件包STM32Cube_FW_WB_V1.xx.xx \Middleware\ST\STM32_WPAN\ble\svc中找到。然而,在实际的STM32WB意向客户中,使用BLE私有协议来开发Profile非标产品的客户占了绝大部分。读者可以去查看BLE_p2pServer、BLE_Custom等例程,对于需要添加自定义ATT属性和服务的应用,现有例程里面STM32CubeMX是无法自定义添加ATT属性和服务。但笔者发现,其实使用STM32CubeMX的Custom Template是能实现上述功能的。 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。 ![]() 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景; S/ t* a, C6 {6 C, N : \6 _/ N; s- [$ n 02STM32CubeMX实现步骤 2.1 创建BLE工程添加并配置外设 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程 ![]() 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。1 S4 |, ]! G1 e# h * v9 e9 ?$ W- w: k+ m: g ![]() 2.1.3 系统配置:调试口 ![]() * h r( Z% s* h. Q- W( Z, R5 { 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE) ![]() . P* ?: R1 O: ^2 S5 U' N 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB78 r& \3 _0 L/ k4 q ![]() 使能USART1的TX的DMA功能和USART1的全局中断 9 n S& s5 Y4 l1 f( t- @# W# ^) b7 D ![]() 9 W& J5 g1 U6 J1 V3 `2 N. b 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 ![]() 2.1.7 外设配置:使能RF,它完全由BLE stack管理。 ![]() 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。0 ]& Z9 N; P0 B7 O* ]3 ] ![]() 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。 2 u3 }# H9 m, ]& ~: d+ y2 d+ L0 ` ![]() 8 Z/ Q. T/ ?2 C8 {: @ 2.1.10 外设配置:配置时钟' T* S/ Q0 I6 E; q & V' u5 }$ M/ @# l% O ![]() - [6 |/ Z9 D8 c 2.1.11 外设配置:NVIC的配置8 A/ H; s- ]- W1 k# @7 u & A3 D& y3 q! b6 _* u ![]() 至此,外设的配置和添加部分已经完成。 2.2 BLE协议栈的添加及配置 2.2.1 协议栈配置:使能BLE协议栈 ' B" z5 j! a: \9 p6 G ![]() 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板2 e1 d T& M b ![]() 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server" : v2 {; c2 a& ]0 g$ Z ![]() $ O1 ], Z) i' S7 Y4 z5 {: l 2.2.4 协议栈配置:GATT服务基本配置 6 b: k3 |6 E! ? i- ]+ c# a- G! [4 k1 Y ![]() 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值 ![]() 7 }1 W/ S& ~0 w3 P( t f/ S7 R 2.2.6 协议栈配置:配置GATT写 服务特征及属性值2 D+ G! r7 o8 k% |+ T5 E" u/ P5 ? # |+ P* V" b, \$ K1 l `8 d0 t ![]() 7 A: ~, y U+ P( c2 Z; D7 H0 Y% [8 e 2.2.7 协议栈配置:配置GATT读 服务特征及属性值1 t n; T( i7 s5 [3 r( v6 ^5 w- s / \$ U1 e6 _5 E [ ![]() & E9 Y0 m$ V% ~0 ~ 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值 ![]() ; g$ n# g; c9 P 2.2.9 协议栈配置:配置GATT广播参数配置 ![]() 2.2.10 协议栈配置:BLE配对参数设置5 `7 ~) V, ^3 K b, L- D ![]() 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) . T8 B. q! r4 w. J: w. S ![]() 2.3 生成工程代码并初步测试: o' E+ \% N4 D+ d1 V 2.3.1 点击“GENERATE CODE”生成工程代码 : e1 Y8 y0 J' P ![]() : E( n) ]" J3 k- j" ` 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码7 L+ q% K( U+ b# a% K 8 V1 L/ P4 r( P3 U2 w# Z* E 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。8 W2 C/ g/ f. Q+ u. u* {- X, _ ![]() 3 B) |! s! x( h 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。2 _. b N' b# |; T3 @9 Z 8 \# A9 T8 l4 i' Q! U( d ![]() 4 H0 c' Z4 g( {1 O- x 2.4 添加BLE Stack应用代码/ s$ l9 W6 M1 |) X7 _! Y 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。 u2 H, i& Q# _3 t7 q" A0 q * m& c: g5 C' h* R. T ![]() BLE应用代码添加:定义用户数据缓存。 在“custom_app.c”文件中定义4个用户缓存区数组。 ) R! i8 v6 ]# W- Q7 i$ H0 F ![]() ! @4 ^+ x: _. ^- k0 k5 @ BLE事件驱动代码添加:2 r4 `0 r/ C, w4 }/ q X 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。4 m- g6 y9 \& \! ^ 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。 \# d- ]6 f/ @" X5 J ![]() 上图对应的代码文本如下所示: ![]() $ t7 U' O z7 P. X5 K9 a ![]() 9 n) k0 Q3 R N5 m/ O2 p : f5 ]# P; Q5 w; m0 Q: A8 o 上图对应的代码文本如下图所示: ![]() + L4 I; m M4 V# u3 b 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。 2 V9 l. S+ N7 i6 P' \( h ![]() 上图对应的代码文本如下图所示: + b$ N/ |$ U6 [) x- P ![]() 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码 ![]() 上图对应的代码文本如下图所示:7 Z8 S4 b! _6 c' g% m 1 d& d8 u! [7 h' D' ] [ ![]() 1 S2 j6 L2 h9 E" C 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。 9 v9 s5 }4 j, B3 y ![]() 6 M9 e( T/ O/ }3 \4 m: R BLE应用数据代码添加:; \0 z& ^* m/ t9 k 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。- ]/ d0 ^+ p0 [+ |# ?7 ~ ) j5 s% N. v t' Z ![]() a( e9 d$ \, X; M3 C+ F4 K4 b' [ 2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节/ G, v) Y$ J9 b 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU), w3 I; x, _- D; F+ U1 z/ P ![]() 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。 5 R) i" J' _1 o7 l. ` ![]() 至此,所有代码更改完成。 4 w/ r9 S' I0 X4 D 03测试平台搭建及功能测试0 ~8 {6 x6 |2 I! ~- O 0 A' q/ K' t3 |/ t+ E/ w; d) l2 f2 Q 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的# X& A6 p* {* w ![]() 查看当前FUS版本,并将FUS升级到最新版本 ![]() . b) D2 ] c, T5 o, P 如果当前FUS版本是0.5.3,FUS固件使用“stm32wb5x_FUS_fw_for_fus_0_5_3.bin”,否则FUS固件使用“stm32wb5x_FUS_fw.bin”,强烈建议阅读BLE协议栈及FUS升级详细说明“STM32Cube_FW_WB_V1.13.3\Projects\ STM32WB_Copro_Wireless_Binaries\STM32WB5x\Release_Notes.html”。1 S3 z* m9 @; x3 S ![]() 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址+ E4 z% Y0 T3 e7 A* A- `$ y2 j" K ' r1 f4 W4 G/ @+ g5 T8 L ![]() 3.2 测试平台搭建及验证 ) c! d/ b2 b* e( P* H2 E 3.2.1 在Android安卓应用市场下载安装“BLE调试助手” ![]() 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。 O' `1 f' ?( J6 L5 q: F ![]() 1 G- t5 p* R- `# v2 f7 j; N: C 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。5 m+ t: D3 e+ h: S7 C* a* W( ^ ![]() " K" b; t0 y5 [9 |: w9 {) A( Q 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试 % c5 p* F7 G% U: i8 B1 j; i I ![]() 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试6 R# \: @# N! i7 j6 a/ w% _1 V ![]() 3.2.6 手机App写User_Write_Data[64]测试 h1 h5 f1 }; N 0 U$ p1 E4 k |% p, K ![]() / {: L2 T! i, G7 L+ v 3.2.7 手机App读User_Read_Data[64]测试。+ G7 m! v5 P8 l% [7 R1 c4 w! g 9 Q6 d# z$ c+ g! q& R ![]() % [' M1 o1 V. |/ J/ }- M 3.2.8 通知数据访问(User_Notify_Data[64])测试 t4 o1 y9 _4 C! f0 _- k1 E ![]() - X* W. V: |6 ] k/ E 至此,整个验证和测试过程完成。 ! m4 q! H, X/ X 04小结4 z& d2 G4 a1 ^+ j# {3 [ BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。 t% v( q( {6 o- U- l3 }) T / R3 S: V. s w 转载自: STM32单片机1 K+ Q$ s3 X2 ~: U |
Nucleo-STM32WB09KE测评-蓝牙调试并使用OLED显示数据
【NUCLEO-WB09KE评测】创建BLE工程和开启调试信息
【NUCLEO-WB09KE评测】+2.串口打印
【NUCLEO-WB09KE评测】+5.实现标准电量服务
【NUCLEO-WB09KE评测】BLE例程HeartRate及工具探索
【NUCLEO-WB09KE评测】+3.蓝牙广播
STM32WB系列MCU低功耗测试
Nucleo-STM32WB09KE测评--IIC传感器读取
【NUCLEO-WB09KE评测】+4.蓝牙控制LED
【NUCLEO-WB09KE评测】+1.点灯
谢谢分享,是否有其他的custom template案例来参考