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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言
$ s" _$ r% `6 G. p, ^! P5 q# ^

) a6 L0 }3 _+ s, xSTM32WB55是一款支持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 [$ }- @  |6 V0 H

4 A5 a& T/ b0 |/ b1 @$ D
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。
) x& g0 |% R' O& f* |7 ^

3 s8 V( H5 p* L! b2 M5 C
微信图片_20231015193351.png
9 ]/ `% S$ e5 E; e6 `# M0 W+ o

% U) X7 t  g* P2 ?! |+ F
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景; S/ t* a, C6 {6 C, N
: \6 _/ N; s- [$ n

# W! y1 J( K/ o& U- Y; f
02STM32CubeMX实现步骤
  ?0 B9 @: a% W7 G# c

6 R9 M1 l+ y$ c0 k! ?& d4 l0 C6 h
2.1 创建BLE工程添加并配置外设
% ^  k6 ~  G$ G' v1 I% X
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
; \$ h$ h/ f7 s& i2 w

0 E+ q3 _* Q) ^3 p3 e; O
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
9 H: c' w; @% L' |& z% ^/ n

: a) j  ~$ d+ g+ @) S. J2 z0 Z4 ?1 @
微信图片_20231015193348.png 8 r  ~& u: z+ T9 N& s; f+ L

: T4 q* R0 z* Y1 `4 e. l" W
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。1 S4 |, ]! G1 e# h
* v9 e9 ?$ W- w: k+ m: g
微信图片_20231015193343.png
$ {8 d0 r4 }8 ^& \8 B+ Y) ~+ ?

0 D  P' a. H9 V6 n
2.1.3 系统配置:调试口

2 l5 d' s) Z1 `$ q" a: e! X6 f
8 D  c- s( ]9 d
微信图片_20231015193339.png 5 q$ G: e) C# w9 V3 y! I; C
* h  r( Z% s* h. Q- W( Z, R5 {
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
2 C' f7 J) ?) U+ ]

! d: G- ]7 a1 T, y( e8 d
微信图片_20231015193336.png ; ~4 e4 u% A# h3 w! a# q

  v) r& ~) ~* _% \' A) u: K. P* ?: R1 O: ^2 S5 U' N
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB78 r& \3 _0 L/ k4 q

% L; ~7 Y/ Z0 d8 [0 R  t: `
微信图片_20231015193332.png 5 |: D2 _' |# D. z6 G: t# Q
使能USART1的TX的DMA功能和USART1的全局中断
$ E  i& G& j% v' O3 _9 n  S& s5 Y4 l1 f( t- @# W# ^) b7 D
微信图片_20231015193329.png
; V* N* a8 q* n* \
9 W& J5 g1 U6 J1 V3 `2 N. b
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
/ v. D) M7 f9 Q) K, }% i$ `' M! R

" ?' V9 Z* @% m% i
微信图片_20231015193326.png * u% |! b) W' o  d9 l$ N" b, s

& Q* c! {) F% o! w# E

6 f, u9 C; t( m+ d
2.1.7 外设配置:使能RF,它完全由BLE stack管理。
; ^& U$ U" F. k% ?$ b( q

/ j/ ?% |' g3 b
微信图片_20231015193320.png % i+ q2 b1 d% `% [2 Y" K" x6 _

" D7 K0 N4 w, \+ I+ `5 m) Z6 ~; c1 X
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。0 ]& Z9 N; P0 B7 O* ]3 ]

2 e+ m/ _/ U! v6 l
微信图片_20231015193316.png
, \4 z) r1 m6 S$ Q
$ D0 Z# j$ \% x3 C5 L5 f1 q+ w; z2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。
4 [9 S, D1 j, G. o$ B+ f
2 u3 }# H9 m, ]& ~: d+ y2 d+ L0 `
微信图片_20231015193313.png / ?& O6 o& _& N+ q
8 Z/ Q. T/ ?2 C8 {: @
2.1.10 外设配置:配置时钟' T* S/ Q0 I6 E; q
& V' u5 }$ M/ @# l% O
微信图片_20231015193308.png
4 r# `# c" c+ M  W4 |6 x# w/ G5 K
- [6 |/ Z9 D8 c
2.1.11 外设配置:NVIC的配置8 A/ H; s- ]- W1 k# @7 u
& A3 D& y3 q! b6 _* u
微信图片_20231015193305.png   g1 L7 {+ Y6 w" l+ w

4 s: l+ ?- M) G8 Y9 P
至此,外设的配置和添加部分已经完成。
* Z8 |$ z  T$ ?& z

# N8 W5 E) s+ t- d

8 k/ q$ {# j% h- L4 z
2.2 BLE协议栈的添加及配置
- z. [6 n' R/ G
2.2.1 协议栈配置:使能BLE协议栈
6 s  U+ X) b& G2 H$ b1 ~& v% P1 e- J0 S
' B" z5 j! a: \9 p6 G
微信图片_20231015193301.png
( t9 F: Y5 j' G

3 z9 Y0 F% I8 K; K
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板2 e1 d  T& M  b

8 W8 M* S  j$ c9 |' _: A
微信图片_20231015193258.png
& V, p; f! T0 Z# z
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"
4 _: V4 n$ }% ?/ b! ~5 E+ I: v2 {; c2 a& ]0 g$ Z
微信图片_20231015193255.png 4 p4 y. {3 H* h: P  a$ h
$ O1 ], Z) i' S7 Y4 z5 {: l
2.2.4 协议栈配置:GATT服务基本配置
$ }) d2 V8 ^/ g+ ]: R1 R  {& Y6 b: k3 |6 E! ?  i- ]+ c# a- G! [4 k1 Y
微信图片_20231015193251.png
/ A$ E; y" ~( B2 B

4 t2 _* P  u& F0 S+ |
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值
8 P1 }' Z: w4 q) g/ Q/ ]% C

/ x& K6 Q! z0 _
微信图片_20231015193247.png
' H% _+ f3 o- W0 Q" @6 n8 S
7 }1 W/ S& ~0 w3 P( t  f/ S7 R
2.2.6 协议栈配置:配置GATT写 服务特征及属性值2 D+ G! r7 o8 k% |+ T5 E" u/ P5 ?
# |+ P* V" b, \$ K1 l  `8 d0 t
微信图片_20231015193244.png
- h) H7 F: [& K, B  p2 K$ [( C7 A: ~, y  U+ P( c2 Z; D7 H0 Y% [8 e
2.2.7 协议栈配置:配置GATT读 服务特征及属性值1 t  n; T( i7 s5 [3 r( v6 ^5 w- s
/ \$ U1 e6 _5 E  [
微信图片_20231015193240.png 5 }/ i' }9 G% D7 Q
& E9 Y0 m$ V% ~0 ~
2.2.8 协议栈配置:配置GATT通知 服务特征及属性值
8 y" b2 o% w7 L9 B' c  |

: T& p) m" V3 a2 G
微信图片_20231015193238.png 8 @1 X0 Z( h9 \/ J( k* j0 g/ X
; g$ n# g; c9 P
2.2.9 协议栈配置:配置GATT广播参数配置
8 q. `+ b8 Y0 v3 e3 a# d

; w. m1 K, n% t8 V- T! c! F
微信图片_20231015193234.png 6 t+ L! C0 Q; \, H3 N+ m/ L

1 g4 L0 j5 E  a1 d; c) C
2.2.10 协议栈配置:BLE配对参数设置5 `7 ~) V, ^3 K  b, L- D

5 I% n6 Q2 P6 v+ L) j! e0 `
微信图片_20231015193232.png
' I) ~1 a1 b4 i: X( y' D1 k+ @+ x

/ `* a3 Z+ w0 Q1 b3 a4 u
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
) {1 i! W  t% l  _
. T8 B. q! r4 w. J: w. S
微信图片_20231015193229.png 3 \0 U; C  U2 E& S, V

- r' w* n, D0 u6 q2 v
2.3 生成工程代码并初步测试: o' E+ \% N4 D+ d1 V
2.3.1 点击“GENERATE CODE”生成工程代码
( L. `7 {* Q7 y; O1 w1 L% U
: e1 Y8 y0 J' P
微信图片_20231015193225.png . M0 I3 I+ Y( Q/ E4 V
: E( n) ]" J3 k- j" `
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码7 L+ q% K( U+ b# a% K
8 V1 L/ P4 r( P3 U2 w# Z* E
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性
- }" p, ?( l9 e+ C4 Y! u

) P# `' v) }9 W2 C
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。8 W2 C/ g/ f. Q+ u. u* {- X, _

8 l3 _% M3 l/ J3 o- I0 n# ~: T
微信图片_20231015193223.png
$ Y6 V$ n& X, H2 b! Q
3 B) |! s! x( h
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。2 _. b  N' b# |; T3 @9 Z
8 \# A9 T8 l4 i' Q! U( d
微信图片_20231015193220.png
! u- V/ Y0 n- p* [* C
4 H0 c' Z4 g( {1 O- x
2.4 添加BLE Stack应用代码/ s$ l9 W6 M1 |) X7 _! Y
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。  u2 H, i& Q# _3 t7 q" A0 q
* m& c: g5 C' h* R. T
微信图片_20231015193217.png
9 G# }8 q5 B% }% g* u

* }9 Y" t. v3 {  F
BLE应用代码添加:定义用户数据缓存。
4 k. ^3 \4 y) J8 f. k. _4 X1 p
在“custom_app.c”文件中定义4个用户缓存区数组。
' Y# X* N4 _3 U5 H
) R! i8 v6 ]# W- Q7 i$ H0 F
微信图片_20231015193214.png ( p" q' _; |  Z/ @! @; V) g
! @4 ^+ x: _. ^- k0 k5 @
BLE事件驱动代码添加:
2 r4 `0 r/ C, w4 }/ q  X
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。4 m- g6 y9 \& \! ^

' y7 Y8 l1 e+ Q* y
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
$ j, J3 C# O7 e; H7 a
  \# d- ]6 f/ @" X5 J
微信图片_20231015193211.png 1 ?5 [( G% L- D2 i4 Z

3 B6 B$ m- M1 A7 {: m
上图对应的代码文本如下所示:
; \+ M3 N' K% x/ _7 X7 t7 t1 X

! S! X* d: E! d0 E8 Y. H( p4 k
微信图片_20231015193208.png
( G- N( y& m$ g$ s$ t7 U' O  z7 P. X5 K9 a
微信图片_20231015193205.png 3 h# x6 b0 _% d
9 n) k0 Q3 R  N5 m/ O2 p
: f5 ]# P; Q5 w; m0 Q: A8 o
上图对应的代码文本如下图所示:
7 y0 k, A! a! c3 \6 e5 a; W, r# I6 Z6 p, K

3 u# O- T4 k$ _% v( V& D4 x
微信图片_20231015193202.png
% w0 u4 T, h1 K1 y6 Y
+ L4 I; m  M4 V# u3 b
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。
; `& E' _3 z' S: w( o
2 V9 l. S+ N7 i6 P' \( h
微信图片_20231015193159.png & W& |6 u" n. U, T$ _! p9 J: H. V

, q4 e. P, K3 U3 @, h
上图对应的代码文本如下图所示:
! m' x& e/ Z+ f9 t9 Y2 w% [; S
+ b$ N/ |$ U6 [) x- P
微信图片_20231015193157.png
' F+ h/ y; s% ^) T$ c

$ J' T+ c+ t+ m$ i( a
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
. e" a/ m+ h; m

4 q) i: }! Q2 Z/ |& x' B7 m* v8 I
微信图片_20231015193154.png
2 h% u$ h6 ^& K7 X; r. t* B9 Y

# H* Z6 N; ]' b0 K' x) P
上图对应的代码文本如下图所示:7 Z8 S4 b! _6 c' g% m
1 d& d8 u! [7 h' D' ]  [
微信图片_20231015193151.png 3 b& Q! K# W5 G: ]4 {
1 S2 j6 L2 h9 E" C
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
: S) q, P5 S; M- ]. J4 P
9 v9 s5 }4 j, B3 y
微信图片_20231015193147.png 3 f- L9 x" m6 c8 m7 Y& Y
6 M9 e( T/ O/ }3 \4 m: R
BLE应用数据代码添加:
; \0 z& ^* m/ t9 k
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。- ]/ d0 ^+ p0 [+ |# ?7 ~
) j5 s% N. v  t' Z
微信图片_20231015193144.png 9 |' P* U# K# W. o! V: |: S4 g
  a( e9 d$ \, X; M3 C+ F4 K4 b' [
2.5 修改BLE最大数据包传输长度

4 a& }( I* K+ v4 u6 `
如果不修改,BLE单包长度最大仅为23字节/ G, v) Y$ J9 b
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU), w3 I; x, _- D; F+ U1 z/ P

. a/ h2 S6 M# S/ a! t
微信图片_20231015193141.png
% `2 r5 `* b; k. b. P5 I& Z* |

9 L7 F) E* {3 M' n+ S9 J1 O
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。
0 C% }6 k( K" q
5 R) i" J' _1 o7 l. `
微信图片_20231015193138.png - b7 ~& K! }, t! Q2 `% x+ x0 K' ^* l* d1 u

# j3 }/ b2 o: {) k  ?
至此,所有代码更改完成。
  l9 O* P2 `( u0 i4 ]* D
4 o2 |* l# ]0 k. V2 Q
4 w/ r9 S' I0 X4 D
03测试平台搭建及功能测试0 ~8 {6 x6 |2 I! ~- O
0 A' q/ K' t3 |/ t+ E/ w; d) l2 f2 Q
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)

( S: n4 k# d2 P7 T# [" i

1 Q/ C; }3 N# s9 R3 ]) C
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的# X& A6 p* {* w

0 y+ {* Y1 B6 C: q, C' {; T; ]
微信图片_20231015193134.png + j8 o: _  h7 o% }

8 z: u* K5 Z  Z- ~) t6 K9 V
查看当前FUS版本,并将FUS升级到最新版本
4 p! H# h- I9 m" @

6 n( \9 p. J5 V- p
微信图片_20231015193131.png " l& w" _( R5 D( w. u
. b) D2 ]  c, T5 o, 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”。1 S3 z* m9 @; x3 S

' T  I! n( X* d: d
微信图片_20231015193128.png
. ?/ _% N/ V4 d- t! q& s

% I" \" w- b3 b$ N) N
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址+ E4 z% Y0 T3 e7 A* A- `$ y2 j" K
' r1 f4 W4 G/ @+ g5 T8 L
微信图片_20231015193124.png
; T) o; O1 E4 S! Y( W& X/ E9 B

; A  |# G, N( K9 \
3.2 测试平台搭建及验证
1 p6 j, |2 @( v" F( m0 e
) c! d/ b2 b* e( P* H2 E
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
0 R  \3 w. R* O( i6 t2 j2 a0 i

; ?) F; s6 t6 d  |8 a! `7 f9 F) W
微信图片_20231015193121.png $ K2 x' O2 ?& L( C5 s

- ?& L$ _% G/ l5 G3 ?( l* \
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。  O' `1 f' ?( J6 L5 q: F

1 c7 K% u, K0 R3 c7 q
微信图片_20231015193118.png 1 T0 }9 F3 a; @0 V, R1 l
1 G- t5 p* R- `# v2 f7 j; N: C
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。5 m+ t: D3 e+ h: S7 C* a* W( ^

5 L  H, M( `9 O
微信图片_20231015193115.png , L) N( |& j6 M
" K" b; t0 y5 [9 |: w9 {) A( Q
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
: t7 }+ A- K2 [/ ^
% c5 p* F7 G% U: i8 B1 j; i  I
微信图片_20231015193104.png
/ z, e& N& y# L, i/ _" g! U

5 A3 Y' X+ d0 O$ K9 `9 U
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试6 R# \: @# N! i7 j6 a/ w% _1 V

/ T: C) I  K( x* r: J' n
微信图片_20231015193101.png
: D$ Q  G) F" i; z3 i5 z

! f2 `/ X, B; N: i
3.2.6 手机App写User_Write_Data[64]测试  h1 h5 f1 }; N
0 U$ p1 E4 k  |% p, K
微信图片_20231015193057.png
& x: P( X9 ?5 w7 W6 `2 l
/ {: L2 T! i, G7 L+ v
3.2.7 手机App读User_Read_Data[64]测试。+ G7 m! v5 P8 l% [7 R1 c4 w! g
9 Q6 d# z$ c+ g! q& R
微信图片_20231015193054.png
  p6 A! d9 ^1 R8 C, _$ f1 _
% [' M1 o1 V. |/ J/ }- M
3.2.8 通知数据访问(User_Notify_Data[64])测试  t4 o1 y9 _4 C! f0 _- k1 E

5 x$ C8 w6 G1 j9 s# b, e2 j7 V* o
微信图片_20231015193051.png
/ y. Y9 S' `3 l7 H% g, P5 A
- X* W. V: |6 ]  k/ E
至此,整个验证和测试过程完成。
8 Z: Q* p# _) c- ~2 e

' \1 a# [% {# ?# e" T! m( ]  D
! m4 q! H, X/ X
04小结4 z& d2 G4 a1 ^+ j# {3 [
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。
! J' C2 y  g- U6 Z& T9 |* d6 x  t% v( q( {6 o- U- l3 }) T
/ R3 S: V. s  w

1 Z- }5 `7 y* Q7 X* x" B转载自: STM32单片机1 K+ Q$ s3 X2 ~: U

" Z: C* M( H! h8 s% \/ x' M
1 收藏 评论1 发布时间:2023-10-15 19:34

举报

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

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

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版