01引言! [$ k" u8 V1 R/ t 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协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。 5 g* `; Q: A) Y+ L, d 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景. ?/ W C2 W: A1 H9 D - {% m) s( @4 k% E) P( D9 _1 H 02STM32CubeMX实现步骤 9 n$ p$ S1 t- c' ?" O2 v; l 2.1 创建BLE工程添加并配置外设 M g- j2 f/ a: f- T& W5 c 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。 7 p6 p( n! A) a- x0 V 2.1.3 系统配置:调试口 d% x8 Q4 {8 @, p & D: z, [+ g/ a6 g / K# g7 c) B% ~ X& _ 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE) - y! L4 {& z5 E1 ^ 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7 5 J5 G) T9 H* e, h 使能USART1的TX的DMA功能和USART1的全局中断 `& P' y0 ?, l/ f! X" Z 0 ^# u5 Y7 b2 F& Z2 Y # m' ^3 Z( K2 r. d 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 0 v1 C) F8 m- ?3 c2 L 0 o. e9 q: C$ Y- g/ m 2.1.7 外设配置:使能RF,它完全由BLE stack管理。. g. s6 \' \) i) R! @2 J4 Q * ^# p- o5 z1 B$ D) t 7 P- n3 J0 o. S4 T: t/ e1 m5 x2 B 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。 6 c; X; ^; U1 l$ s% ~5 Z/ B 4 h1 W4 V; J$ n4 n7 [+ {+ a2 p! A5 B 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。$ _; s- Y: Q1 o* f4 O+ T/ F 1 O. D: d& S* p6 s* _. r/ T, r' ^ : B( H) c2 r2 ?/ A1 O+ D 2.1.10 外设配置:配置时钟9 b& _9 Q! Z8 s/ O; @5 d! } 3 u$ r5 {8 ?. d; l 2.1.11 外设配置:NVIC的配置2 h3 R( t3 r0 g2 j2 P' ` 至此,外设的配置和添加部分已经完成。9 e$ W# }) D+ i: |( x " c$ w% Q3 B5 L * y0 k+ S) A! W. [! X* C 2.2 BLE协议栈的添加及配置 2.2.1 协议栈配置:使能BLE协议栈. C1 k0 L7 p6 `5 z6 R2 A $ R/ c2 T# S. J+ l& l- n ' r& B5 W/ B) Y+ v" G4 f. M7 s 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server" 2.2.4 协议栈配置:GATT服务基本配置 1 k" ^% ?3 U1 d 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值 2.2.6 协议栈配置:配置GATT写 服务特征及属性值 7 q4 S4 v/ ?& k( s$ @& R" p" T- I' |* r " K. t0 H4 q# M+ i8 Z* K/ g' L# \+ g 2.2.7 协议栈配置:配置GATT读 服务特征及属性值9 |! V+ |, W0 c; ^, o. ]; h& l8 F 1 g$ {1 @" L* Q" V. d * K0 r9 @# z; H8 O. l3 H: ~ 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值 2.2.9 协议栈配置:配置GATT广播参数配置4 D; u* @ W6 M 2.2.10 协议栈配置:BLE配对参数设置+ F" {5 U& K) M1 b 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) & D$ G! _7 X4 Q- _) v 3 N& l6 l, H# W; I: u6 q 2.3 生成工程代码并初步测试 2.3.1 点击“GENERATE CODE”生成工程代码 - j3 v9 C p- j) B: ^ , e) @* d/ G5 p& N/ S: Y 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 9 k* y4 U9 y9 V* `- o, x( [# u 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性# h, a5 n- D4 p' L * X& P2 n0 r* ~* A& i3 Y 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。# a2 }; {0 m8 V, l( y. c) h ! J$ X$ ?7 ` b 0 J! N7 o, n" Y1 q8 a& n, e3 y" { 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。 , g( o. I* A L3 K 2.4 添加BLE Stack应用代码4 W2 b' N+ Z& ^ Z* K; ?) ? 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。% w+ v/ ~$ h& m7 ] 4 [1 o+ ^/ y& o( l9 g BLE应用代码添加:定义用户数据缓存。1 P) I8 _- l; b; P 在“custom_app.c”文件中定义4个用户缓存区数组。 8 G* P+ D; Q j! Z0 D6 D5 m9 ?& i BLE事件驱动代码添加: 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。, i9 K$ ]( u$ `( G2 C3 S 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。 - ^. [; z3 f+ j9 M' y 上图对应的代码文本如下所示: * ^! E6 N# P- S+ Y 2 D- F2 v8 w' o0 W& i$ T. ~ 上图对应的代码文本如下图所示:) z& \2 p5 W! [ . |5 x& u g2 K6 F$ c: j 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。 ) A0 C# y: e* Y( P* {# b 4 e1 s9 D' x9 ^7 `9 @ 上图对应的代码文本如下图所示: 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码4 [ |1 M. n/ x6 ]) q % @1 p" V- d4 b5 N+ l L4 ~. C 上图对应的代码文本如下图所示: % h! |5 E2 n% X - a/ s" f% k! X( |5 R 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。- l; g4 u. P B1 ~ V: G5 @ BLE应用数据代码添加:. {5 u1 o/ G& _( d 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。 9 d2 ^) _, f# b 2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)# C0 _* F/ A+ y( _5 n 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。6 a# p0 ~: r% s9 E# l. B6 Q : H' F; C9 E' i$ d3 g+ r2 i+ W 至此,所有代码更改完成。 : v' \4 a0 u- k3 D* P. k/ }$ ? 03测试平台搭建及功能测试 1 W; V+ T. t0 Q- t" w5 ~ 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)& b6 c# D: c& R; o 4 t8 t. ^" q: d- a- N 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的* [' }6 g$ k/ z+ H, J : U7 J$ z, C2 X/ @( C8 Y 查看当前FUS版本,并将FUS升级到最新版本$ m' k; d+ _3 j3 Q5 R+ f7 f 如果当前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”。 ( w$ m y$ c! S2 _; v 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址 3.2 测试平台搭建及验证 ' k% j T/ s% a2 b 3.2.1 在Android安卓应用市场下载安装“BLE调试助手” + h8 A1 L4 |7 ? 3 G, I6 m' u0 R' F 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。$ C! M/ g/ z6 T- _. \3 p3 f % l& q7 [ s8 o' O 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试. j8 y! N( ?1 \6 ?7 Z * b; V5 d! B4 }) X 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试& D) \, N7 J1 o 3.2.6 手机App写User_Write_Data[64]测试: c" q: Y2 x1 J( f, K 7 [/ w1 r: q$ m5 E 3.2.7 手机App读User_Read_Data[64]测试。4 f' p- F+ H z& f# s/ W : x. @# J x% c9 p 3.2.8 通知数据访问(User_Notify_Data[64])测试) c! T5 G) j0 H6 T( k ^ 至此,整个验证和测试过程完成。 ! s- x2 D' x& K" ^4 j 8 P% Z$ {$ X# j* W8 r7 ~- d3 i6 } 04小结3 z. J0 c f. B; s4 z1 M: f BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。 转载自: STM32单片机; z8 ]5 Y/ B; J" E 0 p {2 N `. i! e6 x# R |
STM32WBA55上手BLE点灯
使用STM32WB系列微控制器构建无线应用
STM32 生态系统|基于STM32WB的低功耗蓝牙应用(一)
【NUCLEO-WB09KE评测】BLE创建服务和写特征控制LED
【NUCLEO-WB09KE评测】+使用STM32CubeMX新建蓝牙工程
【NUCLEO-WB09KE评测】创建BLE工程和开启调试信息
【NUCLEO-WB09KE评测】BLE例程HeartRate及工具探索
【NUCLEO-WB09KE评测】使用I2C点亮一个OLED
【NUCLEO-WB09KE评测】STM32WB09KE的内部BootLoader使用
【NUCLEO-WB09KE评测】USART的printf和GPIO的使用
谢谢分享,是否有其他的custom template案例来参考