你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32WB基于Custom Template实现客户定制BLE私有协议

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言
; d! z/ W' h- ?3 a# `
8 E" z  [% {$ L- S) b" ?9 E0 \: o
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是能实现上述功能的。3 ?' Z( J5 J1 q- b! j8 }3 u7 ~7 o/ T/ d
: y; b/ y1 x) X( G- [
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。( g1 U" S9 V4 V! b: q

, }: S3 L9 Z: w4 f/ q6 K
微信图片_20231015193351.png
0 D: A  {5 j$ Y( w( h8 W2 w

: o, c; [3 O& R3 R. [+ T( d
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景! j+ n0 N/ h' j2 ^% m9 q2 G! L
: T' w7 I; Q4 P2 ]! T
# _( x3 K6 @4 e5 y0 |+ G. |: `
02STM32CubeMX实现步骤2 h' j; c. j! e! t+ d

" L* {* _, `% p# p
2.1 创建BLE工程添加并配置外设
- r2 Y. C: `0 \, e3 e9 S/ r( ^
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
- w; Q9 ^! {4 v$ P  [2 l
7 H. ^5 E' K9 o) t* X  i; n6 F
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程+ f  |  h4 M% p, N7 W4 X+ D

  S, y3 _. U" x% N( o$ _* d
微信图片_20231015193348.png 8 r, Y$ ~1 m$ @, z  N* }

( H) o# V+ H  [  e. y' g! a
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
7 \$ W# h( p& ]/ B2 j) S! I, e1 K
; r) h7 z$ ]& Z- ^2 o% d; [
微信图片_20231015193343.png
4 y+ t9 z' w# c- [' X0 f( @4 i  K
/ M: R( N% R$ K8 G% w! V
2.1.3 系统配置:调试口

. m0 @3 u! Q4 b; z& I/ F( x2 K6 d0 N8 A
微信图片_20231015193339.png , g( _" M( {; A- U

6 ^' b" K( j3 s2 |. P2 q
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
4 V. N) [; x. j" p' L
+ J% ]5 s8 x0 R8 e  U
微信图片_20231015193336.png ! K% M& }8 O5 {1 k7 v$ M/ p

# B0 S% ^" I7 a  I3 Z6 I" _9 z7 G; \2 C6 q5 a3 M
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB75 Y" {  k8 h$ q' Q8 D, {  V
8 K# P- Q7 p# }' R8 ?3 f: Q! G: j
微信图片_20231015193332.png
, {9 ^' j8 o: g( j  F
使能USART1的TX的DMA功能和USART1的全局中断+ @: W* w; A$ p" j: _9 c

. F* l, m0 O$ U: |# H* x. P
微信图片_20231015193329.png " U$ V8 A% G" A6 |4 s4 G. c/ v
" Q) F% {% A  o+ k. U( Z2 u& D
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
$ u/ }& b! F. U2 `% k# T
/ K- A" {* O6 d4 l% s8 T/ f
微信图片_20231015193326.png + Z; E  K; h' ?" _' {' t5 O! T
& j, n. q8 C3 h  ~9 v  Z

3 y) K% U( C6 R0 H
2.1.7 外设配置:使能RF,它完全由BLE stack管理。
% S3 Z- g2 W2 d+ Y
9 ]2 a% N" c4 `+ ]1 W% f
微信图片_20231015193320.png
7 j/ A/ Y! g8 a. c
# h& n! A9 E6 o/ p  t) X* ^0 C
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
* G7 t7 }( a8 r6 J  \

8 P6 a, [& n  u' |! D( S
微信图片_20231015193316.png
) g$ {* k/ g1 `5 i$ g: K; L. R# u
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。6 u% A; ?& W3 j/ J3 K5 n2 ]

8 m8 P0 J& i* L  o2 ^2 }0 P
微信图片_20231015193313.png
7 ?  @6 }: a$ H/ w# N

7 H" |! O) Y9 u- E9 u$ f( P
2.1.10 外设配置:配置时钟0 }7 c1 K; e% N+ k( K4 M+ @

9 d6 D' F, u" O+ }: \- e- w
微信图片_20231015193308.png
2 C: S2 K$ j2 Y- O1 w
- o0 g+ Q9 G7 m  T4 f/ o
2.1.11 外设配置:NVIC的配置$ s2 E$ Y9 J* s+ `2 F) x

. H% e$ D: H& Q7 n. ]; P
微信图片_20231015193305.png * x- V6 l. c6 l, j3 m

9 N6 H- n# s; T) _
至此,外设的配置和添加部分已经完成。! R. i6 `1 u5 u1 _0 I* h

$ ]7 ]6 C  P0 q) ?% X8 D

5 H, h) V, E1 m0 r
2.2 BLE协议栈的添加及配置
1 ~- ]$ V$ s+ e' o! w
2.2.1 协议栈配置:使能BLE协议栈# T8 c; l2 ~- l! ~: g; E3 [
! W  M' F$ _% s! A! e
微信图片_20231015193301.png
- ?% X& K# u; X0 X
5 a+ S* ^$ b7 s2 R8 @7 w# p
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
: P/ ]. F! R: n7 h% a! s

4 w6 f5 G6 m! ?+ T" i& g( {
微信图片_20231015193258.png
( S" N% I3 J0 Z/ G7 `# e( m
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"& {. o3 V# D& t4 V# O$ `

) x" y' J; r9 a) [
微信图片_20231015193255.png 4 h3 B! b2 r6 w3 Z( ?% p" P9 L
" Q" x0 b" H7 t; l8 b
2.2.4 协议栈配置:GATT服务基本配置5 x; c! ^& Z2 M) F) w

3 Z$ b8 n/ o7 }# }: w
微信图片_20231015193251.png 7 m( f& w; c# u' L2 X3 |5 B' \

# z' h* l" Y8 o& L; |& o
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值- c) C' c" ]8 ?0 E/ R6 ?% e

- u3 n$ a/ P: `
微信图片_20231015193247.png + S% [2 |6 e2 d& N# s
6 d& h# a  b! a+ b. f" ]8 [2 Z0 }
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
8 p, w7 ^* D, B- j; |
) B2 p7 X% T7 F5 x# r+ l
微信图片_20231015193244.png ) Z1 D1 [; h8 G  D$ H
# T9 V  r3 @9 X; F- d) R, f: Z5 x7 j
2.2.7 协议栈配置:配置GATT读 服务特征及属性值
2 u3 L3 Z/ s" n1 g/ M: o: D4 }) O% ^. x2 I2 \4 l
微信图片_20231015193240.png . W+ Z: f% e8 K$ _
" a8 P/ N6 x9 s, O2 }$ T: O1 [
2.2.8 协议栈配置:配置GATT通知 服务特征及属性值- w* o! j" a1 O. F2 x& f8 }
: ^7 C# Z6 S  O* g* [
微信图片_20231015193238.png
# X$ J8 Q$ D5 T. }: o/ e- d/ L$ Y$ \

' @0 q1 X/ R. m7 {$ S
2.2.9 协议栈配置:配置GATT广播参数配置
- {/ \, J2 C7 I) [7 P! y
4 _9 R2 z8 @* {% R+ R! \, u
微信图片_20231015193234.png ) N  w/ Y; A2 \6 y/ Z4 L" L9 a
' u  b3 R' E) G' T, F6 N
2.2.10 协议栈配置:BLE配对参数设置
5 m; S; W, ?  H1 K" i
, b$ O9 ~: S, t  p$ N
微信图片_20231015193232.png
' \$ W. G) t2 P1 g# Q1 m

; j/ l. c5 ^' i
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
+ f7 v+ `$ `) t

/ `( I0 y. E( w/ o& b6 }& E0 j/ t
微信图片_20231015193229.png
1 |; R" S1 t0 ?( K5 c- z

7 R) O" t( r: P; k" W. I5 x
2.3 生成工程代码并初步测试) a  O* g- Q5 X$ V
2.3.1 点击“GENERATE CODE”生成工程代码
8 _! e) ], J, s" r+ t9 G
- H' ^1 W6 J" F) S8 I
微信图片_20231015193225.png
- X- q8 d. \8 ]" r: M" a9 T
0 O: H& s0 J+ E, v: T& m. z
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码
4 M1 R. {. z; y! |) o
* q2 O8 q  r/ t8 n
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性4 S7 I0 Y5 C3 i4 J$ A4 Y2 h
  O! O; W+ @2 O8 k% `9 N
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
* n* `# K0 R. O4 V) i3 _( L

: @, ~* |. v6 V; p1 N' B
微信图片_20231015193223.png * N. d6 ]: w, o* N+ x
( I0 p( T/ C; N8 }" [% I
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。' u; C% Q# W6 d) f( H

5 i1 R/ O9 u2 z( S- n
微信图片_20231015193220.png
0 ]0 y, p' m2 e/ j8 Q; O; ^

# z# `' {& }$ L: j, H* [
2.4 添加BLE Stack应用代码
9 Y' q( H0 a- E- U+ ?' Z
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。& P" o  P: }/ s7 m9 Y
8 y# H5 O$ W( O% s( Q/ C
微信图片_20231015193217.png ! ~" }* ]  U2 `
& s, S3 R# S. A9 X( B
BLE应用代码添加:定义用户数据缓存。% A  m7 S+ ]# S! {$ ~8 m
在“custom_app.c”文件中定义4个用户缓存区数组。
4 i8 O9 C! Z9 _, W+ }
! _' ^. E: F- `' l
微信图片_20231015193214.png $ S' ?' `1 y( o. O, ^
! T) W9 Y7 [; ?" m
BLE事件驱动代码添加:

. b9 t. w1 n4 D* @) r; S
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。& T8 ^: Z1 b( {" U  F

$ w+ g/ S- O  j" J! f/ ?. A1 F
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。- ?2 A1 l& p% V, y! ?5 Z/ ?$ q# M
2 ^2 S" m2 p2 p. s, H. V
微信图片_20231015193211.png
8 E1 ^  p, k2 }
; d0 S. e' @; i( R( e8 E
上图对应的代码文本如下所示:
& _; |; |) x3 b

# m/ o* s; Z2 q1 c# K( ^
微信图片_20231015193208.png
2 K# Z# P1 S6 j' j7 D5 X7 G
, P% z5 t& x, ]" R4 _0 U' G. ^ 微信图片_20231015193205.png
) y3 z7 \& o8 H3 l/ O! t, {" d0 N  _; p6 E/ u4 D% J
" ]8 _& ^$ |) \% Y- g+ k( ^, I
上图对应的代码文本如下图所示:
% U7 ^' L/ R6 ~  f* x) L5 Q
+ e, G* e( n6 }
微信图片_20231015193202.png   I0 v2 u: y7 m
" u+ i& Z/ A1 g+ X
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。" v7 x& ~* K- r; P

& ~" W% F6 ~' w5 v; a. k
微信图片_20231015193159.png 7 Q+ n7 L0 L( i( j
& \: z0 `5 k; d
上图对应的代码文本如下图所示:. Z$ ^+ H: @4 b& l; D0 m0 R

/ n+ k' Q. R+ a: g/ G8 o
微信图片_20231015193157.png
: n. a. T) G- t' T" O9 _2 A
7 {. v$ Y7 q6 Q
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码% z5 ]; |! H( V, ?
8 z5 K( s( u8 D5 F+ i
微信图片_20231015193154.png ( ^) M' m* t8 S$ v4 U& |2 D

$ V0 r/ }4 `% |8 Q0 Y
上图对应的代码文本如下图所示:
' K  o% g4 N; ^/ I

! ~  n) z% F* F5 q3 T1 ~
微信图片_20231015193151.png ' U3 F. u% o/ q- [2 E

8 @. c9 I. j/ Y1 s) p5 b$ {6 R
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
. v( r- D$ U; O  Q

) ~- m8 T/ ^, W
微信图片_20231015193147.png
, M: K0 u  l3 ~* w
& B1 D9 g' f: d- N
BLE应用数据代码添加:
1 E) ~' e; R3 X* P
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。+ w: T$ r# O) K/ i( n4 E( W
5 h9 n& z6 M+ ?: }
微信图片_20231015193144.png 5 K, H1 d$ k! {; c, g+ i

. a: d6 ~: f5 c, x
2.5 修改BLE最大数据包传输长度

) J  {  C( ~( O' ~7 k
如果不修改,BLE单包长度最大仅为23字节' T: u8 g* Q" g* e
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)
2 c5 O+ B, v% z" b( H# N

4 Y8 j* H& z( ?
微信图片_20231015193141.png + Z7 h, X  P* K9 Q. R4 P2 d$ Q

% {6 A5 K4 s& F: q
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。4 Y3 {9 |: ]  G: R

, H+ L- W. M1 M5 p' B
微信图片_20231015193138.png
# Z5 Y4 ]3 P( r' [' K2 Q

, M8 Q6 n3 C" S9 V4 u9 x
至此,所有代码更改完成。
' S; }) H$ i, H( r& V4 h
. {6 V& I; i. Z2 Z2 O. T$ r

! i9 g5 `# L+ r& H) _" P; M* M: ~
03测试平台搭建及功能测试  X7 B. W, Y. k( P& G% b: H4 n) e
: Y5 h4 L8 w6 I1 O: O' x
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)

2 j' S+ K: Z; t( C# n8 q
0 z1 x  t0 K( C  ]" Q
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的
$ M! f. T% e, n- d4 m' j  I

  j: B0 T3 u" c) n9 N+ C6 |* o
微信图片_20231015193134.png & P- m- S; t6 v. f9 n5 Y  o; y

. V/ W. p* g7 L
查看当前FUS版本,并将FUS升级到最新版本
- x# T% Z" J  I5 y) S

8 e3 ?) s1 ?) ~2 T/ T: ]. s
微信图片_20231015193131.png
1 j& r# T( l6 G8 c1 a( c
5 a7 M+ O; T: n" z1 l; s* Q
如果当前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”。6 K6 J& E: U- k. n) w6 s9 P  |% N

) L- q4 W4 ]6 B  u1 M8 S& y
微信图片_20231015193128.png
  S4 p9 S# f& _% m
- I3 h6 l& C) ^" G5 E
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址- h8 ?7 n8 r. P% J; O! Y
& u* |$ v: b8 K/ P, s
微信图片_20231015193124.png
/ g/ T1 ~. Q& k# F# e+ ^- ?" v
, p5 ^) M0 q. k5 i) e
3.2 测试平台搭建及验证
1 \2 Y; f9 B7 x" z- [, M

" @4 |( g+ f0 p
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
" J9 b' e, `. f$ x

" |; F6 p% I6 G" B: }
微信图片_20231015193121.png & O' A( Z; ~# `, f1 ?
) v/ v! U) \3 E
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。' S6 @* ]: E) y$ F  x9 b. X
, V- p* W5 y" [4 ]) r
微信图片_20231015193118.png 3 d2 {( J2 \, h( I: \% {, ^

) h" T1 I: H* n9 g3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。
& X2 T: z" u0 n5 L" |
2 j3 B- m" r$ j  u' a* z' C
微信图片_20231015193115.png
+ [) H" ]# j& S. J/ i1 @/ e) G) C/ ~

, }- K. ^+ \+ F+ j4 ~
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试. P7 n8 d4 I% N% V

8 l' V6 j/ X9 }* i% g; y" P
微信图片_20231015193104.png & {* D6 [# E, s' }
* C: {8 b1 R0 O9 F+ G# d
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试& x3 ]- e+ P. J
8 _& D. h/ {0 a3 T: _" o
微信图片_20231015193101.png
3 I8 W: q' w* W- F

& C/ j2 p. |1 c- a% v
3.2.6 手机App写User_Write_Data[64]测试- E. m7 k, M; t8 q
& F0 F) h" r7 |' X# Q
微信图片_20231015193057.png 0 u& u' \; O0 k& C& U4 F9 J

% b  C0 n# M0 o4 j, [, E) U
3.2.7 手机App读User_Read_Data[64]测试。! H% ?) ^3 A/ r2 r8 |# m+ t
6 |+ l3 D; |9 C! M6 Z2 I
微信图片_20231015193054.png
* s& Y3 e* O' ?
" Z, b, z) {( a$ R$ K
3.2.8 通知数据访问(User_Notify_Data[64])测试
7 @" x) w7 ~$ ]% b9 |

- @9 Y( w0 G( j
微信图片_20231015193051.png
5 N2 p# r3 Y6 |  K" |; R

: r4 @( S! R' k
至此,整个验证和测试过程完成。0 E$ p1 K$ L. w& g# ^# N
2 U( \: A# g/ i% \8 n' L! ^$ g) Z

: g" p& W" V6 Z8 O
04小结
9 x( U9 d( N/ H
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。
5 Z! C6 a, G' i& M: M" G. [
% D, |7 Z  z& }$ l8 v, k1 s; {# Y9 c! v" y8 [5 V

4 d7 D& I2 Y9 ?) I5 y; m* _, p, r% X转载自: STM32单片机5 o# [: _% g% v3 z

% D+ y9 t- U/ p- K' C. u( l% ~
赞 1 收藏 评论1 发布时间:2023-10-15 19:34

举报

1个回答
ZJU_Tom 回答时间:2024-11-11 19:16:05

谢谢分享,是否有其他的custom template案例来参考

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版