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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言
8 l0 o. J3 _8 H

- `* X+ }5 z: b' E+ {' o  DSTM32WB55是一款支持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/ ]

4 f+ E8 z0 [# x8 n5 {
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。, a/ {8 Q$ ]$ f$ k; G" }( P

& t, u7 P6 v) N2 c
微信图片_20231015193351.png ( v- w  l1 A& @  @9 F4 x) ^
8 B0 S3 [: a( d" V' ?- x
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景, L* G9 O: f* m$ @6 i" f

1 k' Q/ A* ]; @7 W* l
$ T! V' G# K8 y" F- i
02STM32CubeMX实现步骤
7 B, U: T0 w4 Z  W% b
' |- }( 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

0 L' d2 X: l2 ]2 o  T( e! [9 u! i
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
4 W0 x" E3 |( ]9 F8 G

* _7 C1 q8 R  _. W. W) J
微信图片_20231015193348.png
/ n% D& f  ^! _" A7 u/ g& y5 g
! a6 j( D8 q$ N: h" O
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。# F0 {3 @: \3 Z- {7 W6 S

2 d1 M0 f, n( ]% _4 G1 h
微信图片_20231015193343.png
- x- A% g3 z& @7 B, O* t& B7 s7 o( Q

, |3 W. r/ z* ^9 {
2.1.3 系统配置:调试口

3 x$ L; Q4 p: N% z
5 m+ J" y0 F" c; ]
微信图片_20231015193339.png
+ e0 }2 I+ S$ n) i* w
7 @  |' t& o! N. n, o
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)- \5 r: z7 P" {

8 n% R6 H/ H- g* z
微信图片_20231015193336.png 9 Y' J, r2 f6 ^0 B0 \3 G: w0 y

7 F' s9 S/ f, ]9 O0 e: D+ [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
微信图片_20231015193332.png 2 ]- U  H1 F$ P+ U) k7 \4 B3 u8 n, Z
使能USART1的TX的DMA功能和USART1的全局中断
4 }8 {: I. P6 i; y. {" h
1 |1 C* \6 J8 b& X9 B
微信图片_20231015193329.png   n0 C" a1 [7 U

' f3 I+ M& X6 E' ^- m
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
2 w4 y5 c7 b% J5 Z( [8 Q8 L
* O# P" I+ \. t
微信图片_20231015193326.png + y# j; `  }' V7 R

/ [5 U/ V0 k1 A$ `' E+ a
2 I# @) s7 T6 V- u# }# _4 R! Z3 l# i
2.1.7 外设配置:使能RF,它完全由BLE stack管理。& h' }  Y  h' Y

" M' d8 w' A9 @" z
微信图片_20231015193320.png
, s* L# I( M- Y; n3 n
! P. D: Q/ b; B0 I/ e8 K. C% A
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
. Z. P$ m  W# O  \# @

& O. b, g9 y9 r3 k; E; L2 y# R
微信图片_20231015193316.png ) N1 A. @: n/ r2 z0 N5 B

" O! S- g1 W8 ?9 e, h7 K( Y2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。5 k1 z$ \; j! H
( A/ |" J6 A3 q" h# L- Z: p* T; P
微信图片_20231015193313.png # K! ]# ~% U1 a+ @
* E. q5 L7 a! x/ u0 @2 X9 x
2.1.10 外设配置:配置时钟
' H* A  u/ \$ Z6 Z

* \$ C, f( v( i0 p  l" D: q
微信图片_20231015193308.png
6 Z+ w# z9 F- M2 L

+ q+ N5 ^1 D/ x4 B7 ^
2.1.11 外设配置:NVIC的配置1 r" y. U- T5 b9 X: o. X
' i3 }/ B  c( `6 d# {. U- d$ ?
微信图片_20231015193305.png
3 L) w5 ]8 e3 v' ]
' _5 i6 {% P+ v% k
至此,外设的配置和添加部分已经完成。
" C- u! n8 a" h8 F2 ?( m4 l

1 D$ z, V0 Q/ B8 X2 i

4 \' ^  Q, U9 e9 Y3 U# d0 g
2.2 BLE协议栈的添加及配置
6 A4 i) q. x9 D
2.2.1 协议栈配置:使能BLE协议栈( W9 T+ q1 x& a+ ^
( [$ G1 P, Z! {6 d& C# n+ h
微信图片_20231015193301.png ) ^' G% Y: Z: X7 b! E
1 A: ?! ]2 x, W
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
" d0 V  F! x& ]- G

5 M; I* b% F# b0 n4 m, Q. ?/ F
微信图片_20231015193258.png - i0 m# c; G5 f+ b
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"3 n) j' @4 `6 j; i* k( Q( g9 S

/ j+ S4 Z$ P# s! I+ ]5 h8 [* U
微信图片_20231015193255.png
! Q1 f. L" a! @; D, c

* I: A% Q* U  [& y
2.2.4 协议栈配置:GATT服务基本配置
% r" ~) j9 ]# {8 E* I9 Q
5 T$ O+ n1 Y: {3 W* a
微信图片_20231015193251.png ' o% e$ b  \. d. h9 J3 J6 x) _! ^

# e( r  P$ G3 y/ n8 D; u
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值5 R+ O  y- o5 k5 h* }

, C% m" A# x: U8 O' n+ _3 y
微信图片_20231015193247.png ( `' x6 d/ v( d# o

  q: d/ L9 i* \" G$ r4 L
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
( Q( |4 ]' P7 @$ q# G4 Z- M# {
- \5 e" q  z4 v' D2 y. J
微信图片_20231015193244.png
) ^1 [4 p; d  G4 X2 i: C( M
% ^/ s% M/ H1 M8 C# b2.2.7 协议栈配置:配置GATT读 服务特征及属性值
1 h3 M( F  K5 o( o1 u1 w5 B! ^0 Z
1 e. f7 X4 {3 b
微信图片_20231015193240.png
  B1 p( m4 q( |. R6 n
+ T& T% F" u! Q; _9 [; n  a3 B2.2.8 协议栈配置:配置GATT通知 服务特征及属性值( R7 H$ ?  _. j* c/ q2 ]4 ]- B, c2 w- J

& v3 I' _7 H6 q9 [- ?3 E
微信图片_20231015193238.png
: `# W  @& Z: J" |
5 o9 B. {9 ~" w0 H% x. ?
2.2.9 协议栈配置:配置GATT广播参数配置
: `5 O3 \+ n* w& [- H; k( A

- {2 v  i1 \) v% e  J% K" x* q4 i) y
微信图片_20231015193234.png " o; V5 {% G" d$ J; c
' {* f5 m. k1 O/ e, G. b
2.2.10 协议栈配置:BLE配对参数设置
6 O# y6 z3 }9 a, ]+ O- E

. N9 H. p* g( u, H8 t& {
微信图片_20231015193232.png 9 e8 q; S# c( J
8 P9 A# y: z* @9 g
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)  [4 w  f5 w3 |3 O6 ^# h

  f6 k2 _/ h9 Y! k. q
微信图片_20231015193229.png
+ A, u! e5 Z' v# i$ Y1 L& `
0 b( L: |0 n& s
2.3 生成工程代码并初步测试4 W  G5 C+ l6 j. L
2.3.1 点击“GENERATE CODE”生成工程代码
0 E( ~( B2 m7 N2 j" g! d

' K# [! J) y6 E. f( r% m+ m, m( O) L5 ]
微信图片_20231015193225.png " ~. Y" t0 }0 G" ?* J
! 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”属性
) n/ l' A: u$ G+ N

& q: Q) Z5 u" y6 w, S4 x9 i1 i
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
8 c$ X. D+ c5 [9 u. b

7 F1 S' v0 h3 K% f# }; e/ Z9 `, D
微信图片_20231015193223.png 4 T) K- r: Y0 U( |. n# G

9 P, O& l) ^  M- p6 `  R
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。( w- r9 J1 W5 c4 T

; p, U) ]! V# P4 _
微信图片_20231015193220.png 5 G2 N/ X* X! j3 j

0 N  z& |' s  l* d( U8 M0 Z/ f) |
2.4 添加BLE Stack应用代码
4 b0 [" Y5 a; o
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。
4 x, p: |3 {! x7 o

5 b- P. r' c" b+ |: u( A2 w" Q% x
微信图片_20231015193217.png
' D( _8 ?9 n% V; h
) 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

! Q  C0 A; q5 `0 X! S
微信图片_20231015193214.png 0 m  i3 _/ y/ n4 s& F1 J

; n& ^0 k5 Q/ N0 }$ R% \
BLE事件驱动代码添加:

8 E0 m( p/ y2 Y% E% 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层。+ g- U; v0 r: F
9 ^0 |8 D' z& D& A
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
" j" v/ S' C( n7 {1 u& ~, X

- m! u4 M, F; r$ s: b* k
微信图片_20231015193211.png
0 I% a% c, H: k9 K/ J

  _1 F: S1 z! f6 b! b+ T+ B8 X
上图对应的代码文本如下所示:
) ?3 g  P# b. ^2 {% n, c
& {7 x% \3 j  C) ~: F7 z5 m
微信图片_20231015193208.png : V6 n! d" W3 S) |7 t: B# i
4 K4 x2 n9 @0 V1 j2 D2 [1 ^
微信图片_20231015193205.png " y/ H3 h1 x3 m! \
: J* c; ~- }, |4 R6 V
$ A2 \; h4 D% K7 u* |
上图对应的代码文本如下图所示:) s7 y$ l4 o% Y0 a" W) r0 m

8 @" m+ u' b' i/ n
微信图片_20231015193202.png ! V. B" r: T( @
+ g6 R8 L! \( g
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。
: }# w+ I  j- t8 f
5 b9 y7 b1 _" k. J5 d7 b9 T: X
微信图片_20231015193159.png
, ~- Z# j: o, N1 A& V
+ H3 @& N/ v3 C" k7 ~% d$ T
上图对应的代码文本如下图所示:
& F, e; r8 v7 H: _

% T+ {* N* W  i7 |& K/ g& P
微信图片_20231015193157.png
) x  `3 _! p2 K9 V
5 c. U3 K( w% n# [$ s% X1 l
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
( J; n, r9 q6 T" }' S. r) w

( P5 g0 R9 ^1 A) p/ e$ v
微信图片_20231015193154.png 7 A; s, }. S' R% s' w9 u. M5 `
1 ]0 N# s( y* W3 n- Y4 h
上图对应的代码文本如下图所示:
! Q: X/ ~# z/ I% }3 Y
8 N0 [* V: |  ~' o5 v3 E
微信图片_20231015193151.png - b/ h/ l& k# P4 u1 g6 s

+ |# P. E& t' D
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
$ ?! i% a5 v! Z# I% f; L

! n+ V: H1 F- d' q
微信图片_20231015193147.png ' G1 ~8 @9 Z7 [, V- W' L

- P2 B/ C5 w) Y* ^
BLE应用数据代码添加:

, F& E5 h# P! W, Z
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。
9 o/ B& n. P5 g
6 I0 [* A* u) M( A  ^1 T0 c3 p- q
微信图片_20231015193144.png ! l6 J. X( C6 U
9 w7 A5 D  Q. X) B$ G9 ]" B2 o
2.5 修改BLE最大数据包传输长度

# p. X. G' ~' R+ o  A* P4 G! P) c: ?/ V
如果不修改,BLE单包长度最大仅为23字节1 i" J( z+ P1 H
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)
4 _) t! K) D9 v7 n4 u! q. R1 b

& q7 `) a. k1 ^' b5 L  y
微信图片_20231015193141.png 4 w% U+ H/ O; X* ?. S$ H
% 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

0 ~1 i4 C# Q8 Y
微信图片_20231015193138.png
- K) e- a' e: }/ B" y
; H, W7 |4 I  W( ]( T9 N( N
至此,所有代码更改完成。
% y/ @3 {: M' ~! L* h) N/ Y) d/ g9 f4 {! s+ o

% b( v  w! o, _% ?
03测试平台搭建及功能测试
3 U4 z2 k3 J9 _
/ 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驱动是匹配的
1 Q+ O6 P' p7 s; J

0 D4 k1 g- ?" ?; r
微信图片_20231015193134.png
! }/ ?: D! s' z" y6 j

3 z- L6 q9 ?: d* p# o
查看当前FUS版本,并将FUS升级到最新版本
, a. g9 A0 _4 x# P

/ p; w  C- `; F$ E, p* K, r6 v
微信图片_20231015193131.png 2 k) N, Y7 _# _2 G7 |

1 |2 d4 _6 w+ D
如果当前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”。
* N7 M4 `2 W0 {, z5 `
1 X, t6 |( V7 D) a
微信图片_20231015193128.png
/ U& G1 h- H+ ]( ]6 Y/ g2 C* e

* k/ v, l" y3 f5 y8 K5 X/ B6 Z" [6 g* N
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址% }1 |. \( o: k; N! j' P8 k* ~- B
6 c3 Q  f) l3 @  ]
微信图片_20231015193124.png , P( t# o% x" e. i

: q4 v' e5 Y4 I  T( R9 s- o
3.2 测试平台搭建及验证
' R8 l2 f* [) Q2 H! c

8 L9 E7 c7 K: V) a" p" X3 l
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
. Y& s: K2 a; x

2 ~: L. Q) `: i9 |# s
微信图片_20231015193121.png . g+ ]& m# T0 d; Q; o

# O2 \, H6 j7 ]9 _  [
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。0 k; f+ @5 C( e: ~& k; a1 ?

6 I, h3 d& W/ W; k
微信图片_20231015193118.png 2 K/ Y; y# K$ w+ N: d+ K

. o' q. z# `; M3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。# z" O+ a( n5 W
6 l9 z* r. E5 M
微信图片_20231015193115.png " e/ T! Y0 b8 m. E4 x
# ^3 G5 H; ^7 k- k5 `
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
% x0 |( c) z& d( _$ y
5 x+ M2 y) d$ [3 _) V5 z! C3 A
微信图片_20231015193104.png
6 W- `/ D( P$ T3 E( k  \8 M; K2 x

% \1 m4 x5 R: G3 D' F0 q% n2 |
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试
8 x+ ]; t, d% U# v% I
8 ?# j+ m. q+ f" U9 P9 F  [
微信图片_20231015193101.png - ~3 z# h! n( P
  G' K1 y) H5 b, L: l
3.2.6 手机App写User_Write_Data[64]测试
0 y4 @' F) y3 H) @1 O0 `
0 o  y- }7 j; a2 J  @6 x
微信图片_20231015193057.png & @8 B5 D: x6 U* j# K( {& v

* g  u/ T9 m! L5 W- J5 y* t  o
3.2.7 手机App读User_Read_Data[64]测试。# B) P$ g& m' I) O$ C
6 ]4 N* I' K8 j, r" ]
微信图片_20231015193054.png
. }# c+ a0 K# G3 j1 w' R
" f, O2 j0 l0 x# x+ [& O
3.2.8 通知数据访问(User_Notify_Data[64])测试
% q/ j- p: n7 e; ~+ B" d5 `" D. v
# M  u0 }0 c5 C9 Y
微信图片_20231015193051.png
+ G# d5 e5 _" W: E+ T

  Z1 Z, r4 p) ?, U; H1 Y* e! O
至此,整个验证和测试过程完成。* 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
1 收藏 评论1 发布时间:2023-10-15 19:34

举报

1个回答
ZJU_Tom 回答时间:5 天前

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

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版