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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言
. C7 P* E! K2 r9 u. b
4 a/ {% e7 l* _6 L5 X, v4 b% J+ t
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是能实现上述功能的。
( D* ?2 f: e" j3 M( H

) n/ M+ m3 ?: N7 B$ x" A/ U
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。
+ y1 U5 e1 v$ X) s( v
  ?' |6 h+ l* L
微信图片_20231015193351.png 5 p" W' P  L" ]. I/ |

3 P1 n7 B: c- R8 O+ _/ P
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景
9 V1 v; e) n1 S, q4 c
' h2 L* K  S' ?# G5 j; i

4 H$ T# a/ }; X  l' O% f9 d6 Y6 [
02STM32CubeMX实现步骤
7 ^$ C# e+ L) m  v$ K

2 }$ [" f4 A5 f( D6 k/ A2 v7 z
2.1 创建BLE工程添加并配置外设
/ t4 @2 ?0 N% G: c) ?  O& N; N# ?
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
& ?9 {# V" l& z/ e* P% o
6 b7 m* ~3 O1 e" u
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
3 |/ b2 |' {- _

. h4 N2 M4 t9 p7 A
微信图片_20231015193348.png ; B3 J+ f7 ^( f4 j3 h$ F3 e% C

5 y* F( h+ u# T+ h( e
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。7 F' e+ S  [* m8 k
9 C/ R* g4 w2 j
微信图片_20231015193343.png $ T. }" T/ I4 O+ S

, i7 E7 H, L& o4 v) K
2.1.3 系统配置:调试口

# u# G  [3 o. R, Q* F$ v* |% h
- b: t/ w% C& u4 A- L2 ^8 m
微信图片_20231015193339.png 9 f& @) y) F8 ?
4 Q2 E# {) }) |7 B
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)# {7 l9 E$ q0 W/ h0 \  B
* M* }/ L$ F1 \& r
微信图片_20231015193336.png $ B( {6 D" v# P2 P4 R) |; `

% G# d; a6 A) q9 m' h6 s3 k6 ]  P  Z0 M6 k; u2 e
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
! z+ Z8 Q" R) ]! ?
/ K7 A& h6 M/ ?, F! r: C
微信图片_20231015193332.png 8 N( H$ o% L0 c  ^
使能USART1的TX的DMA功能和USART1的全局中断- O( Q! o  V$ l& a# {! f' G0 y( F

3 T2 g) b: Q- q' S3 v
微信图片_20231015193329.png 8 T7 P; }4 N# Z. i3 u1 F1 y

9 m7 r! l1 N3 u6 j, X0 v
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
$ b& [; t3 T9 M; m

* E. i& r! F  y
微信图片_20231015193326.png & I& U( G( ]8 q& L7 g6 p' p9 q  C3 r

6 l) l+ K8 @. p  V$ c* i
7 t1 n3 x- r% D) X7 ]
2.1.7 外设配置:使能RF,它完全由BLE stack管理。
4 a! V* P% C0 }8 l: I  n: T/ j
/ s% ~& t/ y, \- Y0 ~; R
微信图片_20231015193320.png 6 S, Z, C$ F% O" v7 x' Y: E! p
) F. k# A2 P( e
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
1 S( d- {# T) e& M9 T2 k  G# ~; O

+ \& c4 @3 R; x0 v+ r
微信图片_20231015193316.png - C% u* K& b; X2 A( M( K
! z: s6 q1 c  o! d( c
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。+ L7 l7 \7 T1 [3 `: N6 h8 p

* j$ d$ e* U8 f: D
微信图片_20231015193313.png
1 J3 y- T! j4 S8 x# H( F$ v2 U
4 c& ~" c9 ~5 y" B0 k1 C& X! X
2.1.10 外设配置:配置时钟9 n4 z( u3 L8 Q( S# ~9 U: K
4 }: Q& _& t: [% X9 U( j- h
微信图片_20231015193308.png
. f" O3 c' B( j  e& `: c
* E; @- J6 t% T/ e+ K1 @
2.1.11 外设配置:NVIC的配置2 J1 H1 z* p" z

+ `2 @+ V6 d7 |& x
微信图片_20231015193305.png
4 c+ v, w( _' @3 G  I& G, u

  o% y2 u& i$ e+ G/ Z- C% x6 N
至此,外设的配置和添加部分已经完成。
) R  R8 L) L' g2 L
8 ?% e; T* z2 L$ N* Z

5 y% W. F5 Z. ]( \
2.2 BLE协议栈的添加及配置
5 m4 {( a5 e$ Y* ]8 T/ F
2.2.1 协议栈配置:使能BLE协议栈" W. P, ^1 ]4 i9 N3 W8 }
$ s$ Y/ B6 b7 `# A* o0 b
微信图片_20231015193301.png & r; A/ _1 Q8 E/ e9 J" s" C
. ^& _# N- U+ Q% w' s8 M: R
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板/ W% \. {7 m8 z* y: Y' E- ~# C5 q
2 G5 z0 l: F: z6 ^; ^
微信图片_20231015193258.png & M( s! W* D. k1 f4 O
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"% K- e: U/ J  G$ i* W# B
, e3 O. w: @4 D8 \
微信图片_20231015193255.png 9 e! ]/ m+ n" |$ V2 f0 @: x
  X0 M# ]/ Y0 ~
2.2.4 协议栈配置:GATT服务基本配置( S0 O  N. U. X( k- c5 e& Z
8 U# j( P1 \3 o
微信图片_20231015193251.png
7 X0 v( j: T. d

0 ~; |; u# N/ t3 n( [/ I+ j: z
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值
* o/ J* H7 G9 ], k

* u, C+ y$ Z) d7 }% u2 B
微信图片_20231015193247.png 2 ~% F. D! h* @! j' c( N' |
3 h( t0 N$ m/ n" \& ?
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
" n: S7 I9 T( _5 i/ [, {4 q+ h; ]
4 p; Z0 ~; H$ ^& X7 `, G
微信图片_20231015193244.png
; g' c2 H, z- q2 K4 [1 \# h* A5 Y# g+ o8 |8 ^
2.2.7 协议栈配置:配置GATT读 服务特征及属性值
! c/ m1 T; o$ z6 X/ Q. L& V1 |- n& ]' p! K& u2 e
微信图片_20231015193240.png
+ r1 E, O. @3 @3 Z9 J9 Z! b* T
9 k; x0 |( }5 T1 B+ ~2.2.8 协议栈配置:配置GATT通知 服务特征及属性值
, g* f+ J" Q& v
2 G" \4 Q4 c, p7 m/ {4 u1 w( i
微信图片_20231015193238.png ; K* X0 m" Z6 @; i# e- h8 ^
7 D6 u, R9 r% y
2.2.9 协议栈配置:配置GATT广播参数配置
! P9 h8 _5 g' W, T
( l. \+ e( F3 x! ^2 c
微信图片_20231015193234.png
: ^: d, C5 o6 X, {
1 F* L  O% N: S9 b  c! N" m
2.2.10 协议栈配置:BLE配对参数设置4 X; B3 J; ]+ H7 v: B
. H2 b% Z! R' i( Y% M6 R
微信图片_20231015193232.png , `8 I+ y& L7 A+ f
0 Q' b8 D  x) f2 k
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
8 L: Z& A/ o& |8 Q( ?$ |

/ j+ K! `/ c4 n+ d0 ^& ]- J3 j
微信图片_20231015193229.png
7 |+ l  U1 f; Q$ W% z. c4 E
3 `* c$ D& ~, L0 a
2.3 生成工程代码并初步测试$ M: g* f6 h/ j( `, [1 e
2.3.1 点击“GENERATE CODE”生成工程代码* L6 a. M- l9 F

! ?( j' ~: w  m5 b: n) q
微信图片_20231015193225.png
# f" @7 |- }1 R3 |
3 s8 `; H1 v8 c. {" n! d
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码
7 l3 T! j5 U$ q) ]# e) T

9 \# y9 r% {# I' k& C
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性: k3 X, Q  z3 o1 R" ^

6 `' x6 w0 K+ H1 z2 D9 u, I- Y
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
* h, U6 h" E  x9 D+ b0 y
& u$ V) x# y/ E
微信图片_20231015193223.png
' p- ^0 V  F* O( E
, ?* R  g6 E: X0 i
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
8 B4 C+ _" J4 V! f! B

; d' j1 u: s$ h$ M9 \+ u
微信图片_20231015193220.png
- }' I2 o7 c6 G2 G! g

$ ]4 _8 Z* i0 g/ J6 o
2.4 添加BLE Stack应用代码
- @2 E2 m! l4 y) t- `) O
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。
+ ~" y" p3 d5 O- Z0 M  k& i* n
6 i8 U0 |0 G5 ]* y; B$ _5 U8 L+ r
微信图片_20231015193217.png
) R8 A0 O2 e( x# a# N
  c7 [9 m" S6 b8 @# Z
BLE应用代码添加:定义用户数据缓存。6 v: n; n" O; F5 ~
在“custom_app.c”文件中定义4个用户缓存区数组。6 X! @4 l- h( Z

3 `. w. X' v9 L, f; u9 I; J
微信图片_20231015193214.png
" D. d! N* T3 t' L. y
- F- {) [3 I9 t" R. y
BLE事件驱动代码添加:

1 L! j- L% a  j9 G- l
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。" d  L; v; f! t  `5 n- J

2 U3 K- a6 G# u* X9 a* L5 x) _
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
. o( i: ]3 r' B! w' t6 p- k$ |

+ C% F" S* {# }3 ?- H1 a6 d
微信图片_20231015193211.png # r. @7 h) u% a( T. X

4 s! K6 M- ]; ~4 s
上图对应的代码文本如下所示:
$ |6 p% R) q$ X' t' w- S& o

) {5 ?& ^/ o+ N
微信图片_20231015193208.png 9 M5 e% d% d6 V0 H% ~0 j
& i' _8 M# v7 T% H% F/ i+ z
微信图片_20231015193205.png
6 f. N6 X  [3 x6 T" j0 d6 H% E! Z8 J5 y7 u/ G. [: _

1 w* m% \* ]' m) w( A
上图对应的代码文本如下图所示:
+ p. a8 ]2 l+ p+ ]
" l/ ?( |/ Y% m1 q
微信图片_20231015193202.png   g% Y. i7 l/ \) W: x" j9 i
1 N- b3 F  y; n
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。5 D5 n# \+ t: V" I( u4 }' {8 P2 C# d
7 @. v; J- A. t$ f
微信图片_20231015193159.png
2 \, ~4 C( d& Z) @
  W9 T1 k3 V' T
上图对应的代码文本如下图所示:' _  P6 \. e! Y8 f1 a% Q
2 w  V. z" X" k- f. m
微信图片_20231015193157.png 4 h9 s3 U/ b/ ~5 p
9 W9 `  w5 |4 l) _& ?* a; f
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码2 m' q; S7 S9 u/ s2 ~7 j  }: k1 Q: m
% B3 X' v# j# U1 f% b" i7 f) q4 y2 O7 M
微信图片_20231015193154.png % X( R. V& b/ h+ y1 N: n+ @
! U0 X" c, B( ]* D* c6 t) F
上图对应的代码文本如下图所示:  H- s& [/ U* u5 b$ M7 G5 [6 S# X
& `% g2 W# W( Z9 E3 ^
微信图片_20231015193151.png
+ Z$ R' d) `7 e$ x
# f" U. n* ^$ y' O
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。2 P$ w# N: s1 A# g, x

4 r" n! H" K- p+ W. D
微信图片_20231015193147.png & M8 L+ A; g9 P/ H
4 J5 H, i, x1 {9 h  e. h# O& `
BLE应用数据代码添加:

- D2 A: p0 Y- U2 Q$ b
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。
2 H1 g5 B) X* Z+ c" j, O7 B. N& a

& q! _- `- F, j# W' _1 C. ^
微信图片_20231015193144.png
1 n9 y% t; S( h
$ t' m4 o7 F1 j6 Z
2.5 修改BLE最大数据包传输长度

  V) D- X% x8 Z2 ~
如果不修改,BLE单包长度最大仅为23字节
2 h/ |' a2 b# L' J) @1 a
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)8 C! v) w2 l) g" v+ }. y9 {

$ {- x+ K" C1 }9 H5 s
微信图片_20231015193141.png
8 I; a" f0 Q& W$ G+ ?) m3 ~" g
. R0 z8 `- t  U$ W9 U4 x! X# w9 w
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。
. N+ ~* P6 j  S+ S7 V1 c7 n% B

7 D8 E2 I. o5 h9 s, I
微信图片_20231015193138.png
9 v2 R" R6 {9 v  A* j

; p+ d! m& j5 w- y3 e& W! F. w" K
至此,所有代码更改完成。
6 y- z' H, Y' r, r: }8 |  n) ]& Y% q

" j/ E" l$ a/ c7 h) x5 V. p
03测试平台搭建及功能测试
( O( X1 J; \+ a/ x, }6 e
. w' X1 N$ {& u
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)

, _3 L2 ^0 y2 i7 U7 j# ]& \) ^

( K8 ^" }* ~  [+ K% G
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的
9 ?/ U: c( z6 d- O$ a" f
5 u4 b% i8 G: h) U- K
微信图片_20231015193134.png
$ \5 C0 B% v6 P4 p4 h- }* V

; U! ]2 Z6 i+ _5 `
查看当前FUS版本,并将FUS升级到最新版本0 p# f! [' a: b- E
1 F+ c3 T2 t- \* q: T
微信图片_20231015193131.png ' \# P; g: [7 L' [/ Z
4 |+ F  e4 {% v6 H- M6 v( U! g) K  T
如果当前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”。. e; z/ j" O6 ~# |2 \& g

8 ~; I. n& \8 f8 t, M! z% o2 X7 a
微信图片_20231015193128.png / d  L8 d6 ?" Y3 e4 K" x
/ A9 b  [0 j' I" [' ]5 a; V7 b
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
. P9 H& M% c# \% h) B, R
0 F8 M- Y0 z6 c' Z( W( O5 Y2 A
微信图片_20231015193124.png
2 n4 z* [: u! g/ n
3 e: Q6 v% v" G$ B. F4 m: r3 Y  @
3.2 测试平台搭建及验证
4 j3 ~; u; e' z' K

9 P# |. f5 D* r% V' j# [
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
4 I2 W$ F3 w' n3 G- j
1 l, R1 i, ^/ R' m
微信图片_20231015193121.png
: Y4 H* S: L7 f2 d1 B4 q9 i
4 ]% q+ T) C1 _9 k) c: r" F+ h
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。2 W$ v$ t- _3 K! n, {9 v" t

) Y8 V  t$ q0 m9 P2 j4 b
微信图片_20231015193118.png
  J/ V5 d; A; ~$ k) H: \! Z7 d! l$ `6 g* `2 m& \
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。& X/ }+ [! b; t9 m2 D

# \2 Q! s5 x+ n# m! O. j! v0 }
微信图片_20231015193115.png
' Q2 t1 T# z; Q

; E5 \' l7 u9 U1 B3 z
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
' Y& U8 S( D6 Y
% V, Q% k. v1 {! d
微信图片_20231015193104.png $ S7 }! j8 q8 Q! p4 a

# S3 {2 H- y. A9 ^3 `
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试, o4 A2 G* n. |  \

+ M. M& ?5 e# ]
微信图片_20231015193101.png
% _# s0 |' a4 r4 v4 J7 Q; D3 @$ l
% V+ o" I: ^$ h/ A1 m4 d# j
3.2.6 手机App写User_Write_Data[64]测试; o; y4 m8 Y6 e6 l
4 U" J2 Y1 t' O# A$ J
微信图片_20231015193057.png & D9 D% a* ~7 f9 L4 W* U" I

3 I- A+ ]+ y, R; d5 g: B5 H! b
3.2.7 手机App读User_Read_Data[64]测试。3 E& j& q4 b7 J, e% T3 u
% e/ N& A* J5 a/ o8 }4 f, ~
微信图片_20231015193054.png / w- @' P0 ?% W0 q+ r/ [$ V

# @: R: S: P' n; ~, P. h* s
3.2.8 通知数据访问(User_Notify_Data[64])测试
- Y  K  F$ G# E9 U0 ~" L, N
0 Y3 f3 Y  ^* b) }
微信图片_20231015193051.png
# e- w0 }5 M: l$ V7 r

4 b. N. I6 K4 R% A/ \& _+ _
至此,整个验证和测试过程完成。
+ |. W9 T# Q) g/ j+ p

& U% R4 }) t' v

' _. u( ]' _2 f3 W: }3 p- M
04小结, J3 }6 m6 R; m* B0 L+ a5 _- ]" ?$ l
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。1 S3 b# w/ z5 f
3 j' A& a; }! }- f3 Y6 v
, |% u( ]  Z  Z, K4 v* x* C8 M

( Q8 z6 V; V/ ?+ d& ^* j1 C转载自: STM32单片机
1 L: C7 ], k: X7 P" l% c" m. l6 Y4 Z! O# N2 ~
收藏 评论0 发布时间:2023-10-15 19:34

举报

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