01引言 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是能实现上述功能的。* H3 Q' d% F9 R( s, i; N4 O/ ] 本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。, a/ {8 Q$ ]$ f$ k; G" }( P 8 B0 S3 [: a( d" V' ?- x 如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景, L* G9 O: f* m$ @6 i" f $ T! V' G# K8 y" F- i 02STM32CubeMX实现步骤 ' |- }( Z, Z( y- E# x. C% B( s; |' c 2.1 创建BLE工程添加并配置外设+ O2 `, D$ n n* C" w* A7 ^+ K; T 请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB: O# `% [) j+ Q' t2 g& g 2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程 ! a6 j( D8 q$ N: h" O 2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。# F0 {3 @: \3 Z- {7 W6 S 2.1.3 系统配置:调试口 7 @ |' t& o! N. n, o 2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)- \5 r: z7 P" { + [3 N: O0 {% L1 z& a3 s 2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB75 g# ]$ \. k9 n# f% D9 K) q ! r' V0 I4 a" X6 |/ c* n 使能USART1的TX的DMA功能和USART1的全局中断 2.1.6 外设配置:使能HESM,它完全由BLE stack管理 * O# P" I+ \. t 2 I# @) s7 T6 V- u# }# _4 R! Z3 l# i 2.1.7 外设配置:使能RF,它完全由BLE stack管理。& h' } Y h' Y ! P. D: Q/ b; B0 I/ e8 K. C% A 2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。 2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。5 k1 z$ \; j! H ( A/ |" J6 A3 q" h# L- Z: p* T; P * E. q5 L7 a! x/ u0 @2 X9 x 2.1.10 外设配置:配置时钟 2.1.11 外设配置:NVIC的配置1 r" y. U- T5 b9 X: o. X ' i3 }/ B c( `6 d# {. U- d$ ? ' _5 i6 {% P+ v% k 至此,外设的配置和添加部分已经完成。 2.2 BLE协议栈的添加及配置 2.2.1 协议栈配置:使能BLE协议栈( W9 T+ q1 x& a+ ^ ( [$ G1 P, Z! {6 d& C# n+ h 1 A: ?! ]2 x, W 2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板 2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"3 n) j' @4 `6 j; i* k( Q( g9 S 2.2.4 协议栈配置:GATT服务基本配置 2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值5 R+ O y- o5 k5 h* } 2.2.6 协议栈配置:配置GATT写 服务特征及属性值 2.2.7 协议栈配置:配置GATT读 服务特征及属性值 2.2.8 协议栈配置:配置GATT通知 服务特征及属性值( R7 H$ ? _. j* c/ q2 ]4 ]- B, c2 w- J 5 o9 B. {9 ~" w0 H% x. ? 2.2.9 协议栈配置:配置GATT广播参数配置 ' {* f5 m. k1 O/ e, G. b 2.2.10 协议栈配置:BLE配对参数设置 8 P9 A# y: z* @9 g 2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置) [4 w f5 w3 |3 O6 ^# h 0 b( L: |0 n& s 2.3 生成工程代码并初步测试4 W G5 C+ l6 j. L 2.3.1 点击“GENERATE CODE”生成工程代码 ! u y; k- z- l+ g& H 2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码4 H" p" h( n+ a$ _# C( D; H3 w' s 3 m, y5 H3 U( |! s 2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性 2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。 2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。( w- r9 J1 W5 c4 T 2.4 添加BLE Stack应用代码 为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。 ) S3 i) d+ `. h8 x7 e2 Z- e BLE应用代码添加:定义用户数据缓存。" K @! Z/ R* K2 L# c" H4 [ 在“custom_app.c”文件中定义4个用户缓存区数组。1 J* x7 l* B; X3 B 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层。+ g- U; v0 r: F 9 ^0 |8 D' z& D& A 添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。 上图对应的代码文本如下所示: & {7 x% \3 j C) ~: F7 z5 m 4 K4 x2 n9 @0 V1 j2 D2 [1 ^ : J* c; ~- }, |4 R6 V $ A2 \; h4 D% K7 u* | 上图对应的代码文本如下图所示:) s7 y$ l4 o% Y0 a" W) r0 m + g6 R8 L! \( g 添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。 5 b9 y7 b1 _" k. J5 d7 b9 T: X + H3 @& N/ v3 C" k7 ~% d$ T 上图对应的代码文本如下图所示: 5 c. U3 K( w% n# [$ s% X1 l 添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码 1 ]0 N# s( y* W3 n- Y4 h 上图对应的代码文本如下图所示: 8 N0 [* V: | ~' o5 v3 E 添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。 BLE应用数据代码添加: 在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。 6 I0 [* A* u) M( A ^1 T0 c3 p- q 9 w7 A5 D Q. X) B$ G9 ]" B2 o 2.5 修改BLE最大数据包传输长度 如果不修改,BLE单包长度最大仅为23字节1 i" J( z+ P1 H 1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU) % N% g+ S, i! U$ X5 ~0 @/ b 2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。0 O. w I9 F6 Z ; H, W7 |4 I W( ]( T9 N( N 至此,所有代码更改完成。 * h) N/ Y) d/ g9 f4 {! s+ o 03测试平台搭建及功能测试 / g$ s2 Z8 y) J- Z 3.1 使用STM32CubeProgrammer BLE协议栈安装(升级), L0 |2 f1 }6 g. F 6 I$ a$ s/ D" q7 B; w M 升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的 查看当前FUS版本,并将FUS升级到最新版本 如果当前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”。 1 X, t6 |( V7 D) a 升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址% }1 |. \( o: k; N! j' P8 k* ~- B 6 c3 Q f) l3 @ ] 3.2 测试平台搭建及验证 3.2.1 在Android安卓应用市场下载安装“BLE调试助手” 3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。0 k; f+ @5 C( e: ~& k; a1 ? 3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。# z" O+ a( n5 W 6 l9 z* r. E5 M # ^3 G5 H; ^7 k- k5 ` 3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试 5 x+ M2 y) d$ [3 _) V5 z! C3 A 3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试 8 ?# j+ m. q+ f" U9 P9 F [ G' K1 y) H5 b, L: l 3.2.6 手机App写User_Write_Data[64]测试 0 o y- }7 j; a2 J @6 x 3.2.7 手机App读User_Read_Data[64]测试。# B) P$ g& m' I) O$ C 6 ]4 N* I' K8 j, r" ] " f, O2 j0 l0 x# x+ [& O 3.2.8 通知数据访问(User_Notify_Data[64])测试 # M u0 }0 c5 C9 Y 至此,整个验证和测试过程完成。* T( c2 p4 g3 T v$ i$ ^$ v1 [ ; F" M- x+ F% p a; F 6 c! w/ f9 e/ B) |+ Z- C4 B 04小结4 p. A! Z4 `+ X& z7 I BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。& k t5 y( s! K2 E: `2 A2 Y! t : q/ x ` h& D a ! W6 G/ O5 n8 X- q: r# ?) w! [ 8 w6 k u( \; n# B8 O" r 转载自: STM32单片机( v6 m8 y4 H9 _$ f, {0 C' m. u9 W2 J + G6 Y6 H3 e3 j1 g, m |
使用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的使用
【NUCLEO-WB09KE评测】+ 一些坑和点灯仪式
谢谢分享,是否有其他的custom template案例来参考