01引言7 v, ^2 v$ d3 P( A) } " ?" q$ D! g. m+ `5 Z9 g 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 O9 H2 {: w2 @7 D. v4 J5 Q 0 G* B) |5 |3 o) M b! \+ t 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。 ) J* ]$ a& B* F, H 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景5 x0 y" U4 R- H; k7 D+ {0 d 02STM32CubeMX实现步骤, E7 ? l: F5 d; z6 t6 S ( e. ?& ^/ s# B1 M* F 2.1 创建BLE工程添加并配置外设# k8 X& |. ^% X! p, p5 [$ P 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB 4 S4 b8 K7 X% V1 G) _9 ] 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程5 o7 d& d5 P& I" O' |! i # l6 J3 O6 l8 x4 M9 l$ F' T; ^ 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。) w$ |/ q' j; s8 ^0 H 2.1.3 系统配置:调试口 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE) & o! n* [. N+ g4 B& I5 `& \ 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7 使能USART1的TX的DMA功能和USART1的全局中断/ V. I$ m3 j G2 ` / K/ r6 ^( O2 L9 ]* S 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 2.1.7 外设配置:使能RF,它完全由BLE stack管理。 1 @. G; t$ O- V7 N3 o, D; N0 v: u # q) D1 S, J3 `( D9 P$ ` 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。3 _% c( ~2 n4 M( A* } / Q$ D6 e1 e5 ~$ }8 S6 b. ~1 g, m( m 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。 * {8 A y0 ?7 y ) O: W2 P j. |! A% {- H3 p6 P 2.1.10 外设配置:配置时钟6 h2 ?/ L, o" s- d & o ^) p& ^) g 2.1.11 外设配置:NVIC的配置5 e2 k: \+ `6 H- R6 A" Z/ Y 6 J- O- I+ v9 v3 J 至此,外设的配置和添加部分已经完成。 9 J: F3 @: p- ] + p+ c6 O$ P8 C 2.2 BLE协议栈的添加及配置 \: p" h( H, G: \7 }; _0 ` 2.2.1 协议栈配置:使能BLE协议栈2 \6 e' J) ?* j$ a( N 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板# y. d1 F1 M3 _' \4 k 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server" R; _. l9 P* l s9 L) z 2.2.4 协议栈配置:GATT服务基本配置 , U& a- d0 h0 `. `6 F) U [ 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值 $ z. i* Z5 P+ c) x' @# \9 X 2.2.6 协议栈配置:配置GATT写 服务特征及属性值 ' C( [' J2 P" U) A; r+ h ! R# T! _" G1 l8 F2 P9 p 2.2.7 协议栈配置:配置GATT读 服务特征及属性值 . Y" d ~# ~; j w 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值' ?' `: D/ Y/ v. S5 T* O; p 8 j; Q5 B& x$ G' V" \3 Q& e * z9 D. I. O4 M3 m T 2.2.9 协议栈配置:配置GATT广播参数配置0 x6 a8 A, \' ^& k( O 2.2.10 协议栈配置:BLE配对参数设置 5 h, ^" {- k+ { K O" l' U6 d a4 e9 p4 ~9 M( i$ A 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)' W5 Z3 v3 R- \ $ ]& B0 @* U" N) k+ F g 2.3 生成工程代码并初步测试+ V9 B2 m" \ t6 ^ a+ o% v' ?1 x 2.3.1 点击“GENERATE CODE”生成工程代码4 ?, g2 ?( r3 V C 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。4 T8 J; D) I X, Z- f / h, q7 `' c8 V# v4 t / Z, j/ }$ P* D0 F+ U$ | 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。) W E6 ~" S1 ?; R7 |$ | 2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。: l1 [3 D; C! g( S BLE应用代码添加:定义用户数据缓存。& b9 m, O, l; a3 Z# ] 在“custom_app.c”文件中定义4个用户缓存区数组。 + v1 z4 N$ i# V% s % v/ L5 p2 v( o6 F. J BLE事件驱动代码添加:) j$ Z: V) [, N, Q 在“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[]对应的写&读操作句柄)请求驱动代码。 X+ t, \5 n2 \) B m0 z/ M0 {- j 3 D% L9 R+ g+ A+ b 上图对应的代码文本如下所示: & V4 ^3 q+ o; m h 上图对应的代码文本如下图所示: 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。 上图对应的代码文本如下图所示: 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码 ) [8 L( F6 y3 o0 L 上图对应的代码文本如下图所示: : N0 m- X. @' {& X7 |8 d. R 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。9 Z$ a- h/ }3 y1 z( d6 J 1 P9 {. V9 f$ f" e4 f0 o 6 ^2 `# f5 R6 G/ B BLE应用数据代码添加:4 ]& g7 p- S+ G. J: G. ~ 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。9 `: t: ?4 ^( [1 a2 e" N; H / T" r0 I+ w9 a6 Z: N7 X & C. s% ]/ E' g" x. o 2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU), N* y% {* r3 X' d. m* ~ 2 P8 c: o- t1 `+ e6 Y 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。 ( T# n0 b/ a- G& X" X 0 Y) G% s2 R+ H5 \: Q9 b" D( U 至此,所有代码更改完成。 * `% O) b8 T, S 03测试平台搭建及功能测试' `* Y3 a# V$ S5 ^6 t 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)1 o- \8 c3 q( F! O9 n7 Z 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的9 g1 H8 W v& C0 l# H( u9 G) w 查看当前FUS版本,并将FUS升级到最新版本, l" q {8 R9 K0 K- j& o+ _ . D/ l1 {1 x$ G$ H0 R) [ 如果当前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”。 p0 K8 e4 D) }8 R/ B1 e 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址 J H+ _$ ~# c$ B 3.2 测试平台搭建及验证 2 O6 z N$ X% J+ x 3.2.1 在Android安卓应用市场下载安装“BLE调试助手”* Z6 q( Y g8 f; ^6 t 7 A. \: Q1 b5 q) h 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。4 V9 d# g/ m$ x9 ?3 J! ^- w 0 q5 N4 ^' G) u6 o" \ T2 w , a: R2 T/ O- E! N3 ?% ~1 e 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。" j+ v- T8 X: l K& L8 [ - n N5 x% i0 |5 q2 R 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试, q: Z; M; C& N3 j! K 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试8 k" ?" j, E1 E 3.2.6 手机App写User_Write_Data[64]测试 3.2.7 手机App读User_Read_Data[64]测试。 + ] Z/ X. K( k! i: i3 m + X% m1 z0 w( _7 }4 S3 i, |3 u9 E1 w5 S 3.2.8 通知数据访问(User_Notify_Data[64])测试# j2 ?6 z# |( L% i. i6 F0 r 至此,整个验证和测试过程完成。 0 [* S' Z- [7 t) h k 04小结 BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。 9 a' x2 Y& F: f1 P 3 L- R" h4 J; U6 S( s3 E 转载自: 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摸索(二)