01引言3 n1 n( {: [, L5 u: i. W" L# b/ N6 B 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协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。 $ u E+ U. L& ]' d1 L . L5 z4 W- W0 f/ X 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景 : R- T/ h! k* v+ m7 Z- E3 P: ]' \. k 02STM32CubeMX实现步骤 2.1 创建BLE工程添加并配置外设( D$ C. a! w2 V: Q( c9 F5 B& O 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程 6 Q2 f+ x* K3 l$ T# C) Z 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。7 I- N# G$ R$ H' n ' x2 A6 |& Q" ]2 B+ V% a; h! e 9 |2 \( b) [0 f9 y- F$ y6 J 2.1.3 系统配置:调试口 / ]+ O& h# m- [ e 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE) / {8 |7 N4 [' i8 Y3 G- ^' f 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7 使能USART1的TX的DMA功能和USART1的全局中断3 @4 m7 c5 I5 M+ {7 w , h% q$ ^$ U8 i$ n * U" ?( s/ P8 y% r' s" c% U% x 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 7 e d3 j3 J$ n- D7 ~8 _( C$ G " H8 w8 i I& T6 P' N7 y/ n9 i3 S% u 2.1.7 外设配置:使能RF,它完全由BLE stack管理。1 r9 o% p6 [8 s' J! t3 I" E" \ 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。 ) p; K( j) z' g% ? G 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。/ t, I1 K& F/ @" I, v , t. C/ z* M2 r7 z2 g ; }6 m7 A' }* ?( u9 a 2.1.10 外设配置:配置时钟 2.1.11 外设配置:NVIC的配置 - s; N) n: c6 [ 至此,外设的配置和添加部分已经完成。! H Y# {5 V) t6 d$ [$ I0 |# _ 2.2 BLE协议栈的添加及配置 2.2.1 协议栈配置:使能BLE协议栈- n0 U* ^+ p- L9 z 4 j9 P4 r& q5 _$ _ 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板8 v1 }" o) c. \- M4 T5 D Z9 u 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server": F/ }! U' ~& R! Y 8 Y* m! v' u* I& z" C! _. ` 2.2.4 协议栈配置:GATT服务基本配置 + I3 l* u0 t* d. w 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值 2 h5 p& ?1 ~+ K) ]4 r7 z 2.2.6 协议栈配置:配置GATT写 服务特征及属性值 7 _& `5 t" c: S# d6 ~' @ _ ( V. x6 k% u2 P7 N1 f0 E0 v 2.2.7 协议栈配置:配置GATT读 服务特征及属性值 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值 2.2.9 协议栈配置:配置GATT广播参数配置 2.2.10 协议栈配置:BLE配对参数设置 ' O0 Q2 B4 a' [8 q5 E1 K 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) 2.3 生成工程代码并初步测试 2.3.1 点击“GENERATE CODE”生成工程代码 $ I6 c* s4 j+ L4 q 8 U I) h2 e* U' l 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码2 j1 x( d7 y. q3 \ 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。 , E6 m$ _2 g% C2 F 0 |) S" s c, ?. g' M! U 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。 2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。' m( S1 e% A& P 7 t8 z5 S" M) l: O BLE应用代码添加:定义用户数据缓存。" A/ {9 Z2 j% ^2 g6 ~) l 在“custom_app.c”文件中定义4个用户缓存区数组。 * h) K) u+ ?6 R# w# V% B; V ' F9 X, y& a. W7 |5 J2 p1 [ BLE事件驱动代码添加:7 j- ^# ^& J4 H7 C" q4 R# y 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。 , I- h6 b# z5 |- A6 {4 _& ^ 上图对应的代码文本如下所示: 7 `$ M2 j2 n2 Z l% W! w* Y 3 v% S4 V- W+ T' O O9 Q 上图对应的代码文本如下图所示: % y u- O1 t9 A) W 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。 ^3 \. E# {: P# ` % {0 \' A1 q: O: q, } 上图对应的代码文本如下图所示:+ Z8 n* I$ s* y/ R z& H 0 h1 x8 e& z+ L& c. e 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码 % N+ d W/ b, ~; S 0 G# x6 B4 q- y: a [+ A 上图对应的代码文本如下图所示:/ n% y2 ?1 E- A* w! W : I, K* k Y" M 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。 ) w v a c/ {( p4 K! A & Y. \7 l5 `5 a F1 y2 ~9 n BLE应用数据代码添加:$ S0 l. P/ V# ]6 u: T$ G( y' Q: h4 p2 i 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。 ; K6 U, V9 t+ |9 U3 m" o * y4 ^% R4 j+ e 2.5 修改BLE最大数据包传输长度! @4 K" j) i5 W: M 如果不修改,BLE单包长度最大仅为23字节0 y: t+ @' z0 |4 d 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU) 1 \; O/ |5 O; s( c% L9 l5 q, n 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。 4 w8 \" ~9 _# } g) [ 至此,所有代码更改完成。 4 D( Y+ x" s6 n0 G9 }1 Z( J" m8 E " J! g' N8 F x! r 03测试平台搭建及功能测试 " H$ D) [5 z; ^ d' G; b- i 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)( [( O- K2 L4 s" U0 w & C4 |: ^' P$ G6 ]& d! m' K 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的 8 z2 v2 i. v# A: [# y% A" M 查看当前FUS版本,并将FUS升级到最新版本" l. T7 F- S$ `& B/ i/ C ; |! p0 \% b9 D! 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”。 # K; u/ Q& \! s( v2 Z$ N. @ 4 E5 T! e% F, f9 e 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址 . M# I3 L1 J; z1 Q0 T 7 y: d' R# v Q& R+ e 3.2 测试平台搭建及验证 3.2.1 在Android安卓应用市场下载安装“BLE调试助手” " K5 @! }4 n) A 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。- D- Y" q9 [# d4 { ! f, b. D. c1 A 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。 3 B7 M/ w# _) Z9 b$ z) { ' Y3 ]2 b$ L' J! {) ? 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试 ; {( U b; Y- o0 }. [; J/ x6 S 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试; b7 Y' X7 _/ S2 u# Z9 E 9 m& M# y) _: @ ! Y' r4 ?* z7 @% S( V6 @! O& Q 3.2.6 手机App写User_Write_Data[64]测试/ v+ H# P+ t5 o5 w- D, y# X 8 c( `! Y* n8 y g3 ~ 3.2.7 手机App读User_Read_Data[64]测试。9 M! G; r% ^* U' H9 T" I! p/ V . Q8 ?6 e& f, E0 J: U8 L. b* k: U 3.2.8 通知数据访问(User_Notify_Data[64])测试 ' u& D2 a; w$ t( h% \( t5 U, K( D 至此,整个验证和测试过程完成。/ g1 m* a& e3 v 3 B% n8 v$ y2 v+ t ' I# R! a1 `, Y5 C, j* j 04小结 BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。& O' L* P6 U1 n( R) ?! b& X ) [7 T8 Q) x- A* z, @ I2 ? - o/ M- C5 ]' ^9 k# I , G/ {+ s0 L- F 转载自: STM32单片机% C+ y( `1 ?) ]9 R |
4月25日培训|基于ST 双核多协议STM32WB55的Matter方案开发
实战经验 | 关于STM32WB OTA 速率提升引发的讨论
基于STM32WB55的配置串口打印Debug经验分享
基于创建STM32WBA BLE_Custom工程经验分享
来看直播了,就在明天 | STM32 Matter 解决方案,轻松实现智能家居无缝连接
基于STM32WB55开发之套件概述(1)
基于STM32WB55开发之监测STM32WB连接状态(1)
基于STM32WB55开发之修改蓝牙地址(2)
如何基于STM32WB一次性烧写FUS+STACK+APP
【STM32WB55评测】评测四 蓝牙mesh摸索(二)