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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言
1 W/ R/ U1 R6 h, i) m+ \" a) z% z# A1 K
% q  Z) x0 N" s$ g" M
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是能实现上述功能的。2 K$ q0 Z/ a5 [6 `: W3 z
" t) [% H0 \7 i2 i# F$ x
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。. U  t0 U, u1 g* g. S: Y( x# w
/ q5 y9 k9 I  s! j% n4 b7 Y/ f
微信图片_20231015193351.png
* G. z! \2 [, [5 @7 \$ o' u3 c; N

! `6 W0 D' N7 j* G8 U
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景  R: p0 O* Z4 E" j2 k1 e, K8 A
) c, j" i5 V0 t+ F: q
7 R  T" J% i7 C; k
02STM32CubeMX实现步骤
7 r* \2 c4 ?0 N$ Z, _

% L: z5 [5 v6 v4 F2 A, U8 E
2.1 创建BLE工程添加并配置外设. a1 M: z3 f: K! x
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
. V+ \2 `$ d3 o1 y
+ ^5 `3 d5 B% `& u1 C; y
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程; R) Q4 W" f& ]- f0 ~

, g- a! w7 f: H$ r2 b  u  p! X
微信图片_20231015193348.png . H7 b* ?6 i0 d8 B% V

+ q) S+ z  x* h/ k7 G  r
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
, V# U2 c; _& P. M! s

% a* K% @' `6 H% W
微信图片_20231015193343.png
6 e  K4 o: i- R5 I

% O  T! M: F0 u- q6 D
2.1.3 系统配置:调试口

: [! K5 u8 u# r% _0 K* X
# n* o* d# ~8 h8 w
微信图片_20231015193339.png
3 x; V; w! q1 s  `: L. b
( I% O- o6 A, Z7 z" b! C( w
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)0 v4 }$ D& B$ x9 N. p3 o& o

; I# J6 ]' X8 s/ ^
微信图片_20231015193336.png
: D, V, V  P) S. E( ?& \7 h3 t3 O5 Y$ m( Z  V- @2 b
* ^: y$ E9 q, }+ x# g3 S0 P0 L
2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
1 d0 V/ ?( q; V8 U

8 a" D; v* e5 |5 d: u
微信图片_20231015193332.png : G9 B3 Q, L: B
使能USART1的TX的DMA功能和USART1的全局中断
8 c+ g, t  p8 L" K; s6 M7 v$ a& X1 B
2 _+ [# k5 j3 t' C$ O2 U1 F. r& ~! I
微信图片_20231015193329.png
5 k/ _9 _) i& ^, m/ `8 e$ k# A- x

4 i3 P. U" m& R) l( K! R
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
& ?, k4 F  X8 e# y  f8 q8 Q6 B  F
3 W% [# t; h! H6 ?: L" t- L
微信图片_20231015193326.png
- v: I: \9 ^- e+ ]8 l& |

4 p) @+ A. H% e
7 @6 l+ @" V& D8 m8 _
2.1.7 外设配置:使能RF,它完全由BLE stack管理。+ @3 ~2 m+ I- Q/ i" l: O; Z

7 m% u) u/ m* b% k% `7 o
微信图片_20231015193320.png
/ z" d- ^' Y; X7 o7 `% Y

7 a" \3 p: \2 N
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。( C; l- M0 O0 c4 g0 C! f  g, V8 W

& f2 G& U3 q2 R4 G" {' c  q/ g
微信图片_20231015193316.png
, r4 h- V4 v# T- ]! y+ e2 |* E, }0 Q! P* \
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。5 g' R" h( D- s( C2 C$ y5 B9 {

, d$ l# w9 t; L- J$ N
微信图片_20231015193313.png 1 d4 t" S0 ^. v) ^1 ?. {2 V
  \2 L( v% ]/ O8 x% i
2.1.10 外设配置:配置时钟$ F# p. n) B. }; w  E& `

6 T7 Z/ h0 T- Z! h% |
微信图片_20231015193308.png 6 i. Q# d# i& u2 B2 `" C  i
) ~, |( e3 ]0 I; ~  G! I( N
2.1.11 外设配置:NVIC的配置
& }6 `. d/ j  ^( v' U
3 H1 z# z% ?6 }" }9 E- d
微信图片_20231015193305.png 7 w5 @: Q0 i+ e3 l7 C$ @9 n
4 @5 P* [3 t5 F
至此,外设的配置和添加部分已经完成。
- O: M; F- p6 q  g* n) d

) V* P% _% \  K, ^" D( a1 S# c3 P

* }' x; p" U2 G! T3 P% _2 B
2.2 BLE协议栈的添加及配置) c% a4 x; }' O- |; \- L$ Y$ }4 R
2.2.1 协议栈配置:使能BLE协议栈
. A. i# `6 i4 b" O4 N' h, q4 R

  \+ ?8 Q  Y1 j& i
微信图片_20231015193301.png
; @3 J/ p; L1 j8 y

0 e) }0 y$ C. v" H$ W# J
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
! W# v( e6 \. `; K8 C) q. b
) m. L& f2 V5 |
微信图片_20231015193258.png
0 t0 r0 t6 _6 t2 w! g$ Y
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"# P9 _$ x7 W6 v9 @
0 }- Z) a, k7 @4 B
微信图片_20231015193255.png & W; Q( l" {2 U8 y. G( d1 D' u
! `: Q( Y- W0 x1 T" I
2.2.4 协议栈配置:GATT服务基本配置' a" k/ R1 r8 `& X/ {
$ z2 n5 o. C$ @3 u/ E' r* r
微信图片_20231015193251.png $ _/ H$ ~$ u* o/ C$ P! T; @) g: v( Y
) j6 O% G% F8 R+ a2 R! Z; y. K4 R
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值  a: K$ g, G9 G0 u# \( D: a

; i7 ]! l1 r& n% P) `
微信图片_20231015193247.png
% t  \* H" f9 a7 B" @6 d, I8 ]- V

- o' ^1 t' E; p$ M$ T8 h
2.2.6 协议栈配置:配置GATT写 服务特征及属性值- b3 `0 C$ k  h7 W+ R  h; p* p

" f1 I9 L  _9 E: L$ E% z$ U  d, L! t1 R
微信图片_20231015193244.png / L! q: C; G9 j% U! {  c  Z
% m2 ?7 Q4 C. t5 V5 _; o
2.2.7 协议栈配置:配置GATT读 服务特征及属性值# X6 L: {1 b* a$ l2 W' B

) U6 f3 f+ v7 @% }% d. h
微信图片_20231015193240.png
' r7 E) b2 k: Z/ d/ C( p, |' y, s' L) {# d. {2 S, Y
2.2.8 协议栈配置:配置GATT通知 服务特征及属性值1 R3 I. ^) H* v5 p$ C

  U: V" b, @' B( A
微信图片_20231015193238.png
( r) Y% V3 ?" y( D4 }

/ I8 F" J1 V; P4 J( `
2.2.9 协议栈配置:配置GATT广播参数配置
+ I: [0 F2 a6 s; B! U. n* J

* w& {: C) L- C0 x  d& @  o
微信图片_20231015193234.png
* ]! g- X  \3 G* P  k

( k6 R  j" U. ]6 q
2.2.10 协议栈配置:BLE配对参数设置3 |" p: ?3 z& b( l' K9 e
- g4 X' c/ K! W+ T* @. X6 J
微信图片_20231015193232.png # O5 a5 T- B7 h# h
- ^: Q2 _! X) u% \0 U! b% w
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
  r# T) u" ?+ \% z
- f$ L: k* A/ g+ I0 F5 h# v
微信图片_20231015193229.png 1 r5 P3 ?, N' l9 {7 n

% E0 a3 K, `9 e; H( z  C
2.3 生成工程代码并初步测试
( e$ s4 {: Q1 q  R# c1 [
2.3.1 点击“GENERATE CODE”生成工程代码0 p* |) Y7 F+ |. C& b" O% u
! h* D6 ~0 ]" @* Z# M
微信图片_20231015193225.png % p2 }- m5 u& }8 g" N+ L7 B. N! Z: Q
5 D8 W" C4 W8 a$ i0 a  b) r
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码
& S# a% _2 c4 e# z8 n$ t5 d

$ K0 M, E  F& b# e3 K- d) k
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性8 D. ?0 e2 g2 r7 n6 p. [9 b  H: C
& l2 r6 t6 F; E* {
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
4 Z9 f+ ~. U9 A' U

% z# b2 ?* l' p9 @% Q1 e
微信图片_20231015193223.png
4 E* {2 H* q1 ^: G2 V% J" l( ]- q6 l  u

; P+ m# X; E4 c* X0 x# J! v
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。- Q# K6 O% a+ p- Z
: Y6 J1 D9 a6 F8 L: j* ^" `
微信图片_20231015193220.png ) G) }/ Y2 m) i8 _, N) _. c

; y) D) D! x$ Z# j
2.4 添加BLE Stack应用代码
- }- g) K1 [, t+ Q2 |
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。; ~( D6 A) E* p1 ~5 _" z
4 s1 ^' @8 n( K( K1 T9 Z6 ?
微信图片_20231015193217.png + P& j6 G1 C1 o& S7 D# u
1 Y6 V) R) a+ h4 J0 y
BLE应用代码添加:定义用户数据缓存。
& h2 E0 O8 K$ J0 s+ d
在“custom_app.c”文件中定义4个用户缓存区数组。8 c3 Y: p  K' ^$ [0 Z( X

3 P2 c. }, h8 j
微信图片_20231015193214.png " A. _  |1 f$ R8 _7 T  o6 Q& W0 ~
/ `" v" C$ {& y# S. o- H3 S, b' k# |
BLE事件驱动代码添加:
" U" [, W/ G% e0 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层。9 O; q) |( L. u, q- @" ~

3 _& v1 r, @1 h! H& Q5 |0 Q( Z
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。' r" e$ }: S2 W8 V

" M# ?) ~) N) u! I
微信图片_20231015193211.png # a8 u; X6 d+ K. j1 _5 `7 T- B0 s
( b& B" U* K9 c
上图对应的代码文本如下所示:
0 h9 s+ z8 l9 ~5 n
6 Z- a; e7 Q+ y* W0 s
微信图片_20231015193208.png
! t) d8 w, c7 R! L$ M9 f
9 Y! H, E3 n: ]2 L" Z/ U 微信图片_20231015193205.png 8 n4 H7 A" c9 \% j3 _
4 N' z# N+ X/ w. s7 X" o; S# y* G* }

1 Y0 ?( r. z, x  d
上图对应的代码文本如下图所示:
+ M# u: a& F' d+ A6 H9 F$ {

( B# w; N8 A. a& O/ Q4 E2 t: I
微信图片_20231015193202.png - ]! E4 B  \# }% O% H/ ?

* M; ]# X, H$ O+ x8 u; V- s  O" Z/ x
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。; e; K- O+ a5 _

1 W/ n0 l: M4 E
微信图片_20231015193159.png
8 \2 D. l2 I! _4 o) E4 d

& d8 l% D- |0 P" E! E
上图对应的代码文本如下图所示:' ~9 k! m* B  Z9 [% w* M
# x2 ^! i8 C  l0 Q( ?& b% `3 N) r$ u6 A+ W
微信图片_20231015193157.png / [- z; {6 J5 j

9 \- J5 E; t9 b+ ]6 ~
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码! z8 ]  M# C1 c( J4 U3 x0 l
2 ^3 {" j* R$ f
微信图片_20231015193154.png - ]; L- Q8 ~8 y2 {3 n2 }6 e: q

1 p4 R$ k* m+ N# [9 E
上图对应的代码文本如下图所示:7 j8 B$ F, H% s3 I$ {9 J$ q
3 Z% m( _$ N# C
微信图片_20231015193151.png 6 B0 ]1 a6 @8 O$ [' J* ~# `5 E
+ L/ ^3 e- F/ O2 Z7 r
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。5 D; G) N  Q& n) p& `  R! u

, T+ R1 D  L3 d
微信图片_20231015193147.png
* U6 ?; P4 o6 Q  ?5 F6 q
* P$ H8 o( c$ m1 g, s0 @
BLE应用数据代码添加:
7 D1 v0 \- G" ^: I; {
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。
- ~6 s; X1 W8 Y. e
$ K: s' \% I' |! \
微信图片_20231015193144.png
; L8 i6 [9 h9 _! w

; S$ C/ c+ ?2 B* d' o$ W
2.5 修改BLE最大数据包传输长度
+ @' U1 y6 f5 n6 l
如果不修改,BLE单包长度最大仅为23字节
3 b, l0 w7 z; H7 x% t
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)$ z# G: @8 z# X
$ P& e3 T6 R( X
微信图片_20231015193141.png , Z5 A( e8 b+ m$ G7 G4 w

2 p; G# h" P& W. q/ [8 e
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。
: z+ k" S) ^, s, I+ d1 Y' l* p
% Y2 z8 l$ i8 o& O# i* F& h
微信图片_20231015193138.png - L# R" Z0 N$ {8 X& f/ N
+ M! e- o4 h) ?4 p: _
至此,所有代码更改完成。
* K; U) c4 X1 v, F  c  O' S; p' Y/ y3 N& I  U( l. [0 u7 U% h
& V; j3 ?' F. C6 o; B. t/ V
03测试平台搭建及功能测试, l# X7 p/ R- g# R9 T" _
% R% Y! O' r# p5 w7 J5 b
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)

: D* Q. t5 v. b/ g5 g

/ M3 {# M6 h& m7 s( o, v
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的" b9 @6 O4 P4 o  X  p; K' I& z  b
! w- z: l$ v) t: I9 C* `' q
微信图片_20231015193134.png
6 j8 O- ]% Y7 d. S% \

/ |; X% H, Y9 M( m5 l
查看当前FUS版本,并将FUS升级到最新版本* I0 }- j+ C) v; P! O. ?
/ d4 x# p" o7 D* R$ B% r8 k8 q0 I, Z
微信图片_20231015193131.png , C" m# a; Z" ?4 R2 ^5 @2 c6 v
) H$ S+ q& s  u( @/ c8 o+ ]
如果当前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”。
( a4 J2 w3 `$ f+ z8 ^( g( M4 v

* Q" r. m; r7 X. x% ?0 R" l
微信图片_20231015193128.png / M1 L5 P* p3 Q0 Y7 ]+ C
* F! H6 z/ u& E
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
- l8 x7 k" f* f0 |6 y  D' K
( X) U% e; d9 D3 R& t1 m$ S
微信图片_20231015193124.png 9 w, k0 Z5 n/ K8 J9 A, B( ^( p
. v  o7 ?& b" |# ]% N" p  T! F. O
3.2 测试平台搭建及验证
! C5 A& V4 W& S8 ~- n& T. D9 D
/ `) [# h: X4 D5 s
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”  R7 p% e1 Y) J: R! F

# u* m& d3 b. N& E) y( P
微信图片_20231015193121.png
$ N9 I7 j+ n3 q1 ~$ i

7 L" {2 Z. S; [7 ]4 A" f
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。
4 C, r7 @, L3 J7 M1 W

+ ]  m  R$ {( T4 s5 i: Z/ M
微信图片_20231015193118.png , o9 \; `- u  I) s6 I+ K4 s- b
, S+ |5 {2 ]7 J" l1 c
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。" I( Z/ I0 s. M! @6 N! P

5 Z) L  s' p, t2 x
微信图片_20231015193115.png   ~. O: F- y. k  M

4 A4 T! E% J: C) o7 ^; o
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
2 Y$ o: g# D7 M

, V! s: m9 u: k% o9 W  f1 k, Z
微信图片_20231015193104.png
9 C: d" q6 k' e& p+ M' W
6 s5 f. l+ ~& G6 \6 R) ]
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试& g2 p" y3 l6 t" _- j, P3 R
; d; w4 N5 l4 E" B% j
微信图片_20231015193101.png
* R+ z% `# S9 i$ L8 _9 ]; k3 c
. Y. G% Q+ `! w0 s- r8 Y
3.2.6 手机App写User_Write_Data[64]测试8 u4 O/ P# h" a
6 x) \) Y6 M& @5 ~  e: }% u0 ~
微信图片_20231015193057.png
+ f1 z, W" ]) e8 Q+ w+ A" ?

% i; `3 e' Q7 E+ O' u2 X9 F. M/ [
3.2.7 手机App读User_Read_Data[64]测试。
# G( D, t; i/ X. y6 K3 e

% t" ~$ Z- K; O& X( w" ?9 C
微信图片_20231015193054.png
5 b. `3 U% K( n; U0 U
# r/ s: x9 O: y7 h
3.2.8 通知数据访问(User_Notify_Data[64])测试
+ {* n; F" u2 ~3 D/ w& }( a

/ I* }4 P& G" [9 b
微信图片_20231015193051.png
' O# E6 }2 q' o

0 {' T  d8 s( M& T" V0 Q' c- F
至此,整个验证和测试过程完成。  K/ U. R' D' d! D$ H  |

& y$ C) u  Q7 q) v

/ [! m+ Z2 V; @5 a/ L
04小结! Q+ W2 i$ q! e7 f. y" Y7 q. X
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。
( t" i$ o5 c$ b: h3 M9 C; I
4 E# B& X2 G7 ?, B
4 p/ P) h3 Q" {  ?4 Z/ t

& ?& e9 U! E4 R- Y3 T转载自: STM32单片机
9 c; K: o  {: v4 i! X
. G3 `0 ]& B) L6 r1 U
收藏 评论0 发布时间:2023-10-15 19:34

举报

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