01引言 % q Z) x0 N" s$ g" M 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是能实现上述功能的。2 K$ q0 Z/ a5 [6 `: W3 z " t) [% H0 \7 i2 i# F$ x 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。. U t0 U, u1 g* g. S: Y( x# w / q5 y9 k9 I s! j% n4 b7 Y/ f 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景 R: p0 O* Z4 E" j2 k1 e, K8 A ) c, j" i5 V0 t+ F: q 7 R T" J% i7 C; k 02STM32CubeMX实现步骤 2.1 创建BLE工程添加并配置外设. a1 M: z3 f: K! x 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB + ^5 `3 d5 B% `& u1 C; y 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程; R) Q4 W" f& ]- f0 ~ 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。 2.1.3 系统配置:调试口 ( I% O- o6 A, Z7 z" b! C( w 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)0 v4 }$ D& B$ x9 N. p3 o& o & \7 h3 t3 O5 Y$ m( Z V- @2 b * ^: y$ E9 q, }+ x# g3 S0 P0 L 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7 使能USART1的TX的DMA功能和USART1的全局中断 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 3 W% [# t; h! H6 ?: L" t- L 7 @6 l+ @" V& D8 m8 _ 2.1.7 外设配置:使能RF,它完全由BLE stack管理。+ @3 ~2 m+ I- Q/ i" l: O; Z 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。( C; l- M0 O0 c4 g0 C! f g, V8 W ! y+ e2 |* E, }0 Q! P* \ 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。5 g' R" h( D- s( C2 C$ y5 B9 { \2 L( v% ]/ O8 x% i 2.1.10 外设配置:配置时钟$ F# p. n) B. }; w E& ` ) ~, |( e3 ]0 I; ~ G! I( N 2.1.11 外设配置:NVIC的配置 3 H1 z# z% ?6 }" }9 E- d 4 @5 P* [3 t5 F 至此,外设的配置和添加部分已经完成。 2.2 BLE协议栈的添加及配置) c% a4 x; }' O- |; \- L$ Y$ }4 R 2.2.1 协议栈配置:使能BLE协议栈 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板 ) m. L& f2 V5 | 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"# P9 _$ x7 W6 v9 @ 0 }- Z) a, k7 @4 B ! `: Q( Y- W0 x1 T" I 2.2.4 协议栈配置:GATT服务基本配置' a" k/ R1 r8 `& X/ { $ z2 n5 o. C$ @3 u/ E' r* r ) j6 O% G% F8 R+ a2 R! Z; y. K4 R 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值 a: K$ g, G9 G0 u# \( D: a 2.2.6 协议栈配置:配置GATT写 服务特征及属性值- b3 `0 C$ k h7 W+ R h; p* p % m2 ?7 Q4 C. t5 V5 _; o 2.2.7 协议栈配置:配置GATT读 服务特征及属性值# X6 L: {1 b* a$ l2 W' B ' y, s' L) {# d. {2 S, Y 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值1 R3 I. ^) H* v5 p$ C 2.2.9 协议栈配置:配置GATT广播参数配置 2.2.10 协议栈配置:BLE配对参数设置3 |" p: ?3 z& b( l' K9 e - g4 X' c/ K! W+ T* @. X6 J - ^: Q2 _! X) u% \0 U! b% w 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) - f$ L: k* A/ g+ I0 F5 h# v 2.3 生成工程代码并初步测试 2.3.1 点击“GENERATE CODE”生成工程代码0 p* |) Y7 F+ |. C& b" O% u ! h* D6 ~0 ]" @* Z# M 5 D8 W" C4 W8 a$ i0 a b) r 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性8 D. ?0 e2 g2 r7 n6 p. [9 b H: C & l2 r6 t6 F; E* { 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。- Q# K6 O% a+ p- Z : Y6 J1 D9 a6 F8 L: j* ^" ` 2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。; ~( D6 A) E* p1 ~5 _" z 4 s1 ^' @8 n( K( K1 T9 Z6 ? 1 Y6 V) R) a+ h4 J0 y BLE应用代码添加:定义用户数据缓存。 在“custom_app.c”文件中定义4个用户缓存区数组。8 c3 Y: p K' ^$ [0 Z( X / `" v" C$ {& y# S. o- H3 S, b' k# | BLE事件驱动代码添加:" U" [, W/ G% e0 F 在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。9 O; q) |( L. u, q- @" ~ 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。' r" e$ }: S2 W8 V ( b& B" U* K9 c 上图对应的代码文本如下所示: 6 Z- a; e7 Q+ y* W0 s 4 N' z# N+ X/ w. s7 X" o; S# y* G* } 上图对应的代码文本如下图所示: 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。; e; K- O+ a5 _ 上图对应的代码文本如下图所示:' ~9 k! m* B Z9 [% w* M # x2 ^! i8 C l0 Q( ?& b% `3 N) r$ u6 A+ W 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码! z8 ] M# C1 c( J4 U3 x0 l 2 ^3 {" j* R$ f 上图对应的代码文本如下图所示:7 j8 B$ F, H% s3 I$ {9 J$ q 3 Z% m( _$ N# C + L/ ^3 e- F/ O2 Z7 r 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。5 D; G) N Q& n) p& ` R! u * P$ H8 o( c$ m1 g, s0 @ BLE应用数据代码添加:7 D1 v0 \- G" ^: I; { 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。 $ K: s' \% I' |! \ 2.5 修改BLE最大数据包传输长度+ @' U1 y6 f5 n6 l 如果不修改,BLE单包长度最大仅为23字节 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)$ z# G: @8 z# X $ P& e3 T6 R( X 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。 % Y2 z8 l$ i8 o& O# i* F& h + M! e- o4 h) ?4 p: _ 至此,所有代码更改完成。 & I U( l. [0 u7 U% h & V; j3 ?' F. C6 o; B. t/ V 03测试平台搭建及功能测试, l# X7 p/ R- g# R9 T" _ % R% Y! O' r# p5 w7 J5 b 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级) 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的" b9 @6 O4 P4 o X p; K' I& z b ! w- z: l$ v) t: I9 C* `' q 查看当前FUS版本,并将FUS升级到最新版本* I0 }- j+ C) v; P! O. ? / d4 x# p" o7 D* R$ B% r8 k8 q0 I, Z ) H$ S+ q& s u( @/ c8 o+ ] 如果当前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”。 * F! H6 z/ u& E 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址 ( X) U% e; d9 D3 R& t1 m$ S . v o7 ?& b" |# ]% N" p T! F. O 3.2 测试平台搭建及验证 / `) [# h: X4 D5 s 3.2.1 在Android安卓应用市场下载安装“BLE调试助手” R7 p% e1 Y) J: R! F 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。 , S+ |5 {2 ]7 J" l1 c 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。" I( Z/ I0 s. M! @6 N! P 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试 6 s5 f. l+ ~& G6 \6 R) ] 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试& g2 p" y3 l6 t" _- j, P3 R ; d; w4 N5 l4 E" B% j . Y. G% Q+ `! w0 s- r8 Y 3.2.6 手机App写User_Write_Data[64]测试8 u4 O/ P# h" a 6 x) \) Y6 M& @5 ~ e: }% u0 ~ 3.2.7 手机App读User_Read_Data[64]测试。 # r/ s: x9 O: y7 h 3.2.8 通知数据访问(User_Notify_Data[64])测试 至此,整个验证和测试过程完成。 K/ U. R' D' d! D$ H | 04小结! Q+ W2 i$ q! e7 f. y" Y7 q. X BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。 转载自: STM32单片机 |
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摸索(二)