01引言 4 a/ {% e7 l* _6 L5 X, v4 b% J+ 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协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。 ?' |6 h+ l* L 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景 ' h2 L* K S' ?# G5 j; i 02STM32CubeMX实现步骤 2.1 创建BLE工程添加并配置外设 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 6 b7 m* ~3 O1 e" u 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。7 F' e+ S [* m8 k 9 C/ R* g4 w2 j 2.1.3 系统配置:调试口 4 Q2 E# {) }) |7 B 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)# {7 l9 E$ q0 W/ h0 \ B * M* }/ L$ F1 \& r 3 k6 ] P Z0 M6 k; u2 e 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7 / K7 A& h6 M/ ?, F! r: C 使能USART1的TX的DMA功能和USART1的全局中断- O( Q! o V$ l& a# {! f' G0 y( F 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 7 t1 n3 x- r% D) X7 ] 2.1.7 外设配置:使能RF,它完全由BLE stack管理。 / s% ~& t/ y, \- Y0 ~; R ) F. k# A2 P( e 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。 ! z: s6 q1 c o! d( c 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。+ L7 l7 \7 T1 [3 `: N6 h8 p 4 c& ~" c9 ~5 y" B0 k1 C& X! X 2.1.10 外设配置:配置时钟9 n4 z( u3 L8 Q( S# ~9 U: K 4 }: Q& _& t: [% X9 U( j- h * E; @- J6 t% T/ e+ K1 @ 2.1.11 外设配置:NVIC的配置2 J1 H1 z* p" z 至此,外设的配置和添加部分已经完成。 8 ?% e; T* z2 L$ N* Z 2.2 BLE协议栈的添加及配置 2.2.1 协议栈配置:使能BLE协议栈" W. P, ^1 ]4 i9 N3 W8 } $ s$ Y/ B6 b7 `# A* o0 b . ^& _# N- U+ Q% w' s8 M: R 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板/ W% \. {7 m8 z* y: Y' E- ~# C5 q 2 G5 z0 l: F: z6 ^; ^ 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"% K- e: U/ J G$ i* W# B , e3 O. w: @4 D8 \ X0 M# ]/ Y0 ~ 2.2.4 协议栈配置:GATT服务基本配置( S0 O N. U. X( k- c5 e& Z 8 U# j( P1 \3 o 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值 3 h( t0 N$ m/ n" \& ? 2.2.6 协议栈配置:配置GATT写 服务特征及属性值 * A5 Y# g+ o8 |8 ^ 2.2.7 协议栈配置:配置GATT读 服务特征及属性值 1 |- n& ]' p! K& u2 e 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值 2 G" \4 Q4 c, p7 m/ {4 u1 w( i 7 D6 u, R9 r% y 2.2.9 协议栈配置:配置GATT广播参数配置 ( l. \+ e( F3 x! ^2 c 1 F* L O% N: S9 b c! N" m 2.2.10 协议栈配置:BLE配对参数设置4 X; B3 J; ]+ H7 v: B . H2 b% Z! R' i( Y% M6 R 0 Q' b8 D x) f2 k 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) 3 `* c$ D& ~, L0 a 2.3 生成工程代码并初步测试$ M: g* f6 h/ j( `, [1 e 2.3.1 点击“GENERATE CODE”生成工程代码* L6 a. M- l9 F 3 s8 `; H1 v8 c. {" n! d 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性: k3 X, Q z3 o1 R" ^ 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。 & u$ V) x# y/ E , ?* R g6 E: X0 i 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。 2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。 6 i8 U0 |0 G5 ]* y; B$ _5 U8 L+ r c7 [9 m" S6 b8 @# Z BLE应用代码添加:定义用户数据缓存。6 v: n; n" O; F5 ~ 在“custom_app.c”文件中定义4个用户缓存区数组。6 X! @4 l- h( Z - F- {) [3 I9 t" R. y 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层。" d L; v; f! t `5 n- J 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。 上图对应的代码文本如下所示: & i' _8 M# v7 T% H% F/ i+ z 0 d6 H% E! Z8 J5 y7 u/ G. [: _ 上图对应的代码文本如下图所示: " l/ ?( |/ Y% m1 q 1 N- b3 F y; n 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。5 D5 n# \+ t: V" I( u4 }' {8 P2 C# d 7 @. v; J- A. t$ f W9 T1 k3 V' T 上图对应的代码文本如下图所示:' _ P6 \. e! Y8 f1 a% Q 2 w V. z" X" k- f. m 9 W9 ` w5 |4 l) _& ?* a; f 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码2 m' q; S7 S9 u/ s2 ~7 j }: k1 Q: m % B3 X' v# j# U1 f% b" i7 f) q4 y2 O7 M ! U0 X" c, B( ]* D* c6 t) F 上图对应的代码文本如下图所示: H- s& [/ U* u5 b$ M7 G5 [6 S# X & `% g2 W# W( Z9 E3 ^ # f" U. n* ^$ y' O 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。2 P$ w# N: s1 A# g, x 4 J5 H, i, x1 {9 h e. h# O& ` BLE应用数据代码添加: 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。 $ t' m4 o7 F1 j6 Z 2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)8 C! v) w2 l) g" v+ }. y9 { . R0 z8 `- t U$ W9 U4 x! X# w9 w 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。 至此,所有代码更改完成。 : }8 | n) ]& Y% q 03测试平台搭建及功能测试 . w' X1 N$ {& u 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的 5 u4 b% i8 G: h) U- K 查看当前FUS版本,并将FUS升级到最新版本0 p# f! [' a: b- E 1 F+ c3 T2 t- \* q: T 4 |+ F e4 {% v6 H- M6 v( U! g) K T 如果当前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”。. e; z/ j" O6 ~# |2 \& g / A9 b [0 j' I" [' ]5 a; V7 b 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址 0 F8 M- Y0 z6 c' Z( W( O5 Y2 A 3 e: Q6 v% v" G$ B. F4 m: r3 Y @ 3.2 测试平台搭建及验证 3.2.1 在Android安卓应用市场下载安装“BLE调试助手” 1 l, R1 i, ^/ R' m 4 ]% q+ T) C1 _9 k) c: r" F+ h 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。2 W$ v$ t- _3 K! n, {9 v" t 7 d! l$ `6 g* `2 m& \ 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。& X/ }+ [! b; t9 m2 D 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试 % V, Q% k. v1 {! d 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试, o4 A2 G* n. | \ % V+ o" I: ^$ h/ A1 m4 d# j 3.2.6 手机App写User_Write_Data[64]测试; o; y4 m8 Y6 e6 l 4 U" J2 Y1 t' O# A$ J 3.2.7 手机App读User_Read_Data[64]测试。3 E& j& q4 b7 J, e% T3 u % e/ N& A* J5 a/ o8 }4 f, ~ 3.2.8 通知数据访问(User_Notify_Data[64])测试 0 Y3 f3 Y ^* b) } 至此,整个验证和测试过程完成。 04小结, J3 }6 m6 R; m* B0 L+ a5 _- ]" ?$ l BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。1 S3 b# w/ z5 f 3 j' A& a; }! }- f3 Y6 v , |% u( ] Z Z, K4 v* x* C8 M 转载自: STM32单片机 " l% c" m. l6 Y4 Z! O# N2 ~ |
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摸索(二)