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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言. q( o2 F( t* I% X" P
/ p' ^, n* l8 ^. a* [
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是能实现上述功能的。5 a- P" {1 c) E. L; l' p
& A: }& T( N2 O& x8 F, w
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。# P) M/ \0 K6 i; N1 }: h4 g
3 f. w. l/ F" O0 d
微信图片_20231015193351.png 5 Q8 V# v4 ]* S0 W( N& Q

$ _/ T2 Q& L( o2 K( s* X( h
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景- }4 i6 I# @' M( u5 M3 n
) Q! f* @, k' B1 v- |

/ [" y8 {& W  z( t0 w/ [6 O0 G
02STM32CubeMX实现步骤
$ Q% j8 R) G- Q# ~
6 m5 r6 `! \' k+ \7 F
2.1 创建BLE工程添加并配置外设1 j/ B1 Z* l! l+ l0 O; s
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB3 \7 d# J( W# r$ |& _% g0 B: c' ~5 W  b$ I

+ U# R, A( G, D1 \
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
2 Q, M1 Y0 W& o1 l8 m% R  }# q. w
# k4 t# O, f2 |, q& p  x0 f8 t
微信图片_20231015193348.png 9 E; J% X- z* M0 T& ~

$ `+ ], R5 ~& U) X: b& u) ?" a
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
, t% m( w& t" b1 n$ @! ~

9 g5 T1 u- M. Z5 e# }' l/ ?
微信图片_20231015193343.png & C& U6 A% C$ _# z+ y6 W) `

; }# S9 V8 O$ O, a! n) |7 j
2.1.3 系统配置:调试口
% S# k& }+ C/ K5 z$ d

! C0 }, t8 A. R
微信图片_20231015193339.png 6 g/ g9 X5 ?9 S( y/ _) x; k3 E
9 a. h2 H' }; q3 [) ]$ s% m. V( `
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE): v* X/ V7 j% K# ^- M4 R+ J

+ m; t: \3 u' W, o) y
微信图片_20231015193336.png
5 a: D; n4 o/ B. a0 _% P
3 H! f' M6 J- t; P' B- S. _7 R/ I2 V; O! Z! J
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7% A7 j" e0 l5 I
7 `/ Q7 ]- y: f9 J- s& n# v
微信图片_20231015193332.png $ o2 G; t" z0 X3 I& O
使能USART1的TX的DMA功能和USART1的全局中断+ y* f* C8 g3 a+ G/ `, u

% {* Z+ Q# g8 Y+ E1 P
微信图片_20231015193329.png ; Y, _" x. h4 ~: F
5 f  n* e! |8 E7 ^* g
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
! K+ x1 P) U4 X# _
) X# L/ e+ C! q! c# y4 {
微信图片_20231015193326.png - S) a7 G+ C6 g6 B$ e
; d/ z; z! ~2 j( @6 n- ?  ?

& v7 s7 s' u( x* T
2.1.7 外设配置:使能RF,它完全由BLE stack管理。
8 g% I* \  g# v* f4 Z  |
& \  g# n8 C9 `$ {
微信图片_20231015193320.png ( d$ c. D" ^) m! }1 _: T

, T2 t# \5 f/ s' o2 U1 {- Q/ O
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。5 ]2 [0 _% E6 }& }/ E* O3 B
3 `2 r- P" X0 T5 Y
微信图片_20231015193316.png 8 _) Q7 ^# r+ R2 A$ N

: P' n: E& i7 q8 }2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。' ]7 N$ E8 \" b: u( c' l, Q

6 _5 V2 N* \4 s  P1 q
微信图片_20231015193313.png
' r' s  J/ P! [5 f( L! [) Z
: X7 X9 M: q: c' p6 R5 X: c" I
2.1.10 外设配置:配置时钟
6 P& H& ~0 X+ Z* a5 X9 S7 o
' e3 ~/ D! Q1 `! |9 Z
微信图片_20231015193308.png 5 c* y: ]% h  c2 H" T$ M

8 _9 A5 w* H4 h
2.1.11 外设配置:NVIC的配置) L3 S; f: _8 \) c0 V

9 U7 ?8 N; s) S/ ]1 Z+ G
微信图片_20231015193305.png * Z# e& I# Y6 g& I" Z

1 P* P8 q$ \# y, I6 P7 r7 b; @
至此,外设的配置和添加部分已经完成。! ^: b0 O. K' n! y, s

4 E  S2 `3 d7 F- D
& q/ m: i5 p6 {: v
2.2 BLE协议栈的添加及配置" z  {5 L2 N  l$ I5 ]* Z; b7 C4 l
2.2.1 协议栈配置:使能BLE协议栈
0 C7 |( n1 V+ P3 @5 q

6 ^% O1 Q! M7 b/ F4 b- q2 ~
微信图片_20231015193301.png
8 F) f8 Z+ G4 m5 P: S5 G6 e5 n

1 Z, `1 s. J6 f
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
7 j6 l0 a* l1 I: t1 ?

5 Z* w* [2 L2 s" t! I
微信图片_20231015193258.png
* U3 E/ w# m) i0 s. {( V
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"5 i; e+ I, N& Z6 s

+ \: J# ?) X6 j' ?* J5 \" [( e
微信图片_20231015193255.png - a/ K- d3 u, }. N7 G

7 X/ U3 E8 h1 X2 U1 w# q
2.2.4 协议栈配置:GATT服务基本配置
+ j" _" m% }) k
, K- W. t; j! R) D5 a9 U# w: e
微信图片_20231015193251.png 0 x0 l' ~5 T1 [" V

. ^' c6 _$ Q* \, B! T) ~$ J! c" {7 c
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值' x2 l# e/ e6 t$ l; w; r4 }, B

$ j2 {! U+ v- S4 S' D5 p* B. s
微信图片_20231015193247.png
4 `: E6 {/ _5 x
. s& [- p6 T" T! c- q5 G5 g2 U
2.2.6 协议栈配置:配置GATT写 服务特征及属性值# X) q$ X( S$ r/ f. _* [0 U  O

3 T4 Q+ s, R& K2 J* C) s' E9 U/ Z
微信图片_20231015193244.png
/ m8 X. c# k( h8 C+ E, e! b' i9 O% ^6 c9 |3 I( r
2.2.7 协议栈配置:配置GATT读 服务特征及属性值
8 p8 R. v; g; b
% ~, F2 p* _/ V& Z
微信图片_20231015193240.png
/ e" t" J$ v$ e3 r4 A( r2 R
1 W  Y! L: Y* s0 C" N( L2.2.8 协议栈配置:配置GATT通知 服务特征及属性值, ?& v* U" w' N. s
5 ~6 p: y9 g. ?" H
微信图片_20231015193238.png
9 P+ m5 o" {, e! Q3 m& @4 V0 @, K3 U
5 `# a  O; H% p
2.2.9 协议栈配置:配置GATT广播参数配置! g1 B! ?1 |6 ?* X" w+ P9 ]- z$ V

9 r, g; D! S1 C
微信图片_20231015193234.png
, E" V, J* J$ x8 k* }) ~
% e8 L) a. r9 h& X" F
2.2.10 协议栈配置:BLE配对参数设置
7 n* g4 E" M9 V3 w4 [

" }+ l6 h7 r% J! f( k' b: a
微信图片_20231015193232.png
' E' n% u0 k5 _! b
& G/ X& W! o+ O+ b
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
) r/ C& f* \4 H! M7 G2 ~7 H& t
' v, J7 h( q% c4 V: n! }
微信图片_20231015193229.png
9 X( C- ]6 @: W$ t9 g1 f5 O2 |9 ^

, J& s/ G. |7 ]6 {
2.3 生成工程代码并初步测试
1 v- M# Z" M, c) H; X1 P0 H* {
2.3.1 点击“GENERATE CODE”生成工程代码4 @6 z# ^* c0 v# C
! ]: O( s& P, r
微信图片_20231015193225.png
" U5 P- A' L+ v) f
6 x0 t1 h( B/ \3 S
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码" S; P( Y7 J* q# u; _- h
6 w4 C3 p0 s8 O
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性  j$ I: K, j& X% X3 T9 {7 Z! Q8 }
7 ?! j9 I1 ^- g% p
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。1 _% g- k# r% Y. x
+ ^& R$ s5 z8 t. l4 m) B# R
微信图片_20231015193223.png
! U- S/ X0 H6 z. r8 G  x

* w6 O' r, s+ X' j' Q! |) R
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
- {( b3 c/ z3 K/ k

4 j4 [$ E" b1 Y  _
微信图片_20231015193220.png : J7 j: C$ l# e1 j( E+ b+ ]/ v. g! z

+ X$ R* l6 K6 _4 d/ d" ?! z2 W6 ?
2.4 添加BLE Stack应用代码
0 E, ~9 a9 R4 ]9 D' G1 [! K# d
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。
. |. e  b$ D6 V- E  a4 J: J

; z/ b. H+ F) K+ `1 ?* P9 Q
微信图片_20231015193217.png
% I3 O! b2 b! H

' z+ b) n& j0 S  [, B) M" E9 L
BLE应用代码添加:定义用户数据缓存。* I; o  v" o6 M7 F6 G
在“custom_app.c”文件中定义4个用户缓存区数组。$ d  l# ?! p* R$ C& u" L6 Q( p/ \% M
$ G: A! K; f& P) z+ ~
微信图片_20231015193214.png 9 C0 Y0 X, c0 n/ F1 N
+ @6 X+ p. B- y) p1 _; J
BLE事件驱动代码添加:
. w# P! c" `3 X' F* v8 i4 U
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。7 K5 N" {# A& B9 G
: G# i0 Y) q' e1 L
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。7 _* o9 z! a3 U1 ?, U2 w
6 o) v: M# r2 [7 u& z* i
微信图片_20231015193211.png
; O2 D' _0 m+ ?* O
- u% C. |( y; J
上图对应的代码文本如下所示:3 C9 v3 {4 w! f+ V" e& x4 t

) L1 r5 m; X$ \3 j% y" M
微信图片_20231015193208.png
6 g1 M' E; p( [( W7 f$ \, q! c* W2 X2 W# ?( A
微信图片_20231015193205.png
  z2 i0 E" P& |/ S1 b8 p0 U
7 T5 q0 z& d0 W2 U7 J$ k4 @/ G! d2 Z4 t. C* j$ S- \2 B
上图对应的代码文本如下图所示:
2 y5 L2 t) k5 n" }; [, W

0 W, c5 S' Y4 D3 f
微信图片_20231015193202.png 4 i' S. g* h/ C8 l- q/ u

6 i  B. W. w: d$ u9 U6 [$ A5 M7 ~
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。7 U7 U! d& s, `

* r: b5 m2 [- X- c' Y8 V7 c
微信图片_20231015193159.png
  M9 H! v6 J$ D4 E
( I2 f7 C# I8 D! y
上图对应的代码文本如下图所示:, B3 _: d, X+ \+ Y

  j/ j& J$ @7 ^; \% ~
微信图片_20231015193157.png   u! g: Y2 Q( J" L& q; |
( Y& F( [. d7 T3 i. U
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
/ b5 L5 i; h, d# d7 p
/ |+ ?6 }9 i% v) C" f8 [; W
微信图片_20231015193154.png ( d& g4 h! K3 i: c% X) X
4 ~. M2 [# }' U# ?
上图对应的代码文本如下图所示:
8 F1 t: S9 O% I8 f4 _/ b
5 T. s- D% {1 f/ m! k; J$ I
微信图片_20231015193151.png ! ~: Q: O4 ?3 E( r! M9 X3 F* c6 Z: n

  T7 k! ^. U5 J
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
) B) S7 ^5 [: f9 v

. P* \/ p. l2 _" c& D( |
微信图片_20231015193147.png ) K% l  v! e; U, |( C
8 k- N) c9 V" _0 C# l3 |
BLE应用数据代码添加:

7 U+ D  I; `: h  ]. G
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。  W' L- h/ Z/ x# ]; S) Y

0 _- a7 b5 [6 J' n
微信图片_20231015193144.png % U+ m( [4 T2 g9 m3 V
6 H2 h" C. v2 }- J& t$ ^
2.5 修改BLE最大数据包传输长度
, Q5 K9 `; j- f' B9 g# c" [
如果不修改,BLE单包长度最大仅为23字节
8 c" ?/ [; Q0 X, X
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)) \, V5 s2 k% i% G1 B, p

5 t9 B1 R; `; f  j% n) P, x
微信图片_20231015193141.png
* ~( w9 O) S. w
% M4 f" q4 s- z
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。  K3 M5 `; v* X

# z) y) u* Y; z  m0 @
微信图片_20231015193138.png
( v; P  j  h$ t, a! Q9 z3 I6 L

' v& b% t, I9 @  ^9 T. I4 ]
至此,所有代码更改完成。* ~2 e. T7 }3 v, H* R

1 A4 g% D- A& I8 N  w
  G% N5 I. t& h6 E
03测试平台搭建及功能测试; Y  f8 O' z* q. o

: Z% M- T. d8 k! ]8 `
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)

* P) p2 O: m' U: X
8 Q4 h* Y) u8 g0 A
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的1 N  O0 H* X/ U5 r1 K5 p

3 N" a1 z/ j4 K, ]# r- q
微信图片_20231015193134.png
* {+ W7 Q  O' k6 l5 s
7 A- M1 _* r+ u" ?, I6 d& K
查看当前FUS版本,并将FUS升级到最新版本
' s+ f  o$ ?6 G4 F# j2 F
, b% V! _9 n4 |2 m' s
微信图片_20231015193131.png
: F2 \, R* |& O
1 T# y0 w" u$ A) J% L. C; @9 k0 t  ?1 p
如果当前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”。
, ^- p! a/ [) T5 G$ M9 J3 T" F7 ?
1 W( t- q; V/ l  |6 H! r9 y
微信图片_20231015193128.png
' F/ s" {" J% u4 f1 b% t

) ^0 X2 r7 n1 t
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
& V) F+ u) f% {5 l! q

, p8 G% f+ j3 X4 n5 |
微信图片_20231015193124.png . H  ]' d2 w/ e- ?  T$ ~) C. a

4 I& `+ Y! F9 o
3.2 测试平台搭建及验证
: J7 Y$ W4 q1 L, n
: `: Q* u! G/ f+ S+ M
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
2 K3 h, D- ~& {7 S2 b: _0 k( l

3 M5 ~$ E- ~8 V# p8 T# K6 K
微信图片_20231015193121.png " t' ~8 L% U1 L" U$ O+ m1 @  J5 c

, }: R% Q3 e4 V; h
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。4 L9 [* g* t8 ]; U) C5 h

; V1 S! t. d& a
微信图片_20231015193118.png
5 l$ i2 G# c) t8 P% T7 n' v. M2 G+ u0 ^) k& |
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。9 b) `0 c' y0 n

6 h$ \! ~5 S8 D, A8 H4 N' f4 f
微信图片_20231015193115.png
" m$ t! G1 c* a1 e1 f

& P( l6 P8 f* D$ x
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试$ N/ H1 f; h8 ~$ H( y

* ]9 F2 B7 L+ X8 \. o  [$ o
微信图片_20231015193104.png   T, H) `& l  _6 [/ Z- c4 l5 {5 e

- W: \, x+ r& s- ]- N$ ^
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试  d: x  j& q% F. x- i# l' Z! C
7 p! F9 w& \1 N
微信图片_20231015193101.png ! }9 b* l: h; S+ G+ v4 s
5 @1 Y/ x9 [  g% i: {1 k; G- A
3.2.6 手机App写User_Write_Data[64]测试
2 U! A$ q/ y' L9 Z7 `) S6 T4 p

% J( y# A+ N: I6 H7 d1 W# p
微信图片_20231015193057.png 5 i7 f0 Y# q$ |1 ^: H; M- ~
% I7 z; q9 D* Z* t3 ?2 s  o
3.2.7 手机App读User_Read_Data[64]测试。! \: r( [/ r) U7 ?" T% Y* C
* _6 E) s3 ~2 e/ @% j6 ]
微信图片_20231015193054.png
+ w1 o' s7 ?8 w, X" }- `- q

8 j- W" @- a* |1 g
3.2.8 通知数据访问(User_Notify_Data[64])测试
$ Y2 i& I7 P8 F% z8 _
' N% q* Y( }! D0 I
微信图片_20231015193051.png
* x) k/ J* W: ?5 y
3 t' F" c' X# `
至此,整个验证和测试过程完成。  a. m& Q/ L& l
5 [+ j& v2 K2 ~8 s8 x% y1 ^8 d+ _3 k
( u& S# \4 E# P7 E
04小结
5 J$ a3 _! y8 Y  `
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。; L5 }, I' [& ]
5 p; |$ X# `6 p0 k8 N, f

3 A. [0 I7 D& A, _# ?$ P: {% T
& [2 S& @) V: I) H
转载自: STM32单片机- L5 Y/ r* B* {6 E
& A! l. h6 {$ `2 Y/ x/ V0 m
赞 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 手机版