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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言3 n1 n( {: [, L5 u: i. W" L# b/ N6 B

& c- |+ v4 S5 C) }7 B; w: HSTM32WB55是一款支持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是能实现上述功能的。
/ z. G6 L5 r; z; e3 G; @. q

4 P& d! O9 B# P; Z* V( }
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。
* ?; E, A# T+ O( d
$ u  E+ U. L& ]' d1 L
微信图片_20231015193351.png
1 `' j  K2 U$ f+ h9 X4 Y
. L5 z4 W- W0 f/ X
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景
% c, V1 T8 z1 v& T. `7 j

2 u$ L( C5 `4 T. M5 M6 n) W
: R- T/ h! k* v+ m7 Z- E3 P: ]' \. k
02STM32CubeMX实现步骤
( t5 S5 S# d9 h$ l. R# Z

8 e9 }6 S: a# Z
2.1 创建BLE工程添加并配置外设( D$ C. a! w2 V: Q( c9 F5 B& O
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
7 g1 V$ ~) n0 D- [. Y( }8 Q

6 L/ u- V$ f$ K
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
* O; y! m/ d$ |" U7 s

- }7 _, U! l, H/ j! M$ }! N
微信图片_20231015193348.png
- o4 l* x  V0 G3 u3 Z4 O9 o" z: x
6 Q2 f+ x* K3 l$ T# C) Z
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。7 I- N# G$ R$ H' n
' x2 A6 |& Q" ]2 B+ V% a; h! e
微信图片_20231015193343.png   M$ s. ?9 ]3 g. I" p
9 |2 \( b) [0 f9 y- F$ y6 J
2.1.3 系统配置:调试口

+ a; j: k8 V& f! w/ ]+ O& h# m- [  e
微信图片_20231015193339.png ' t8 B/ B' P/ K/ D5 R# w

$ Q) ]: s* b, l7 {2 h6 o
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
1 n/ y  x0 \7 l3 ?; ?& _1 ^/ x+ |! A

) t( D( |* c1 D2 P. H( M
微信图片_20231015193336.png
; ~/ D* Y: _  s- a/ {8 |7 N4 [' i8 Y3 G- ^' f

6 S3 F: T3 i/ A5 G3 K5 J) L2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
2 h) ^4 g2 B  v, f( r* L' W" f* e

3 C% _  `+ ]5 }
微信图片_20231015193332.png
! ~; C1 W# I7 b0 i
使能USART1的TX的DMA功能和USART1的全局中断3 @4 m7 c5 I5 M+ {7 w
, h% q$ ^$ U8 i$ n
微信图片_20231015193329.png 2 A8 o6 t1 @5 _+ N" S2 `/ V
* U" ?( s/ P8 y% r' s" c% U% x
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
( g9 G! s; m6 x) ~

6 ]* C; E! |! V) D
微信图片_20231015193326.png
. m. l: [% w6 w7 [: T
7 e  d3 j3 J$ n- D7 ~8 _( C$ G
" H8 w8 i  I& T6 P' N7 y/ n9 i3 S% u
2.1.7 外设配置:使能RF,它完全由BLE stack管理。1 r9 o% p6 [8 s' J! t3 I" E" \

, V! s0 \7 E4 w& M7 O" ~
微信图片_20231015193320.png
+ W2 |  X! k4 e, O

$ W; n- ]4 `; [! Q' n2 F
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
1 O) l8 S3 B7 V4 d
) p; K( j) z' g% ?  G
微信图片_20231015193316.png
! y7 g, _) z$ Q% w1 f: _0 V
  f* y  S+ x# `" t2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。/ t, I1 K& F/ @" I, v
, t. C/ z* M2 r7 z2 g
微信图片_20231015193313.png - h; P% H0 F! N; r8 e. {
; }6 m7 A' }* ?( u9 a
2.1.10 外设配置:配置时钟
# p4 p4 |2 q6 `2 H5 I& }% m

% X' J0 U- c% i3 B7 D
微信图片_20231015193308.png
7 E: l& ]& ~$ ?

. L/ L- h+ d* L. |  L
2.1.11 外设配置:NVIC的配置
% Q3 r6 g1 Q* f# P

* q/ ?; B: g/ R7 h; K' |) I
微信图片_20231015193305.png $ U, k1 g5 {  e  g
- s; N) n: c6 [
至此,外设的配置和添加部分已经完成。! H  Y# {5 V) t6 d$ [$ I0 |# _

: Z2 r  n0 X4 |8 d. [: _5 p- B1 O

6 b9 A3 `, o6 g8 y0 y$ \3 d0 w& W9 J
2.2 BLE协议栈的添加及配置
+ @' p6 J& b, ^# L  M: a
2.2.1 协议栈配置:使能BLE协议栈- n0 U* ^+ p- L9 z
4 j9 P4 r& q5 _$ _
微信图片_20231015193301.png
/ ?3 B: E6 l: Y, q! g, h9 R

5 T. B) r; d* ~+ ~/ f2 g
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板8 v1 }" o) c. \- M4 T5 D  Z9 u

9 {3 \) `" P4 B6 R
微信图片_20231015193258.png
  L- k8 e& s5 I
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server": F/ }! U' ~& R! Y
8 Y* m! v' u* I& z" C! _. `
微信图片_20231015193255.png
, Y) i4 z6 y& O- N( [' R7 o- j

3 p) d; J; h2 X# L7 ]* U
2.2.4 协议栈配置:GATT服务基本配置
6 D2 \6 ?4 L& C; H5 i/ a7 P2 t+ I3 l* u0 t* d. w
微信图片_20231015193251.png
& Z0 r; R# b" E& Z* a

. Y, ?% I; R+ z/ Y0 {
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值
; m- i( J9 d/ ]$ l) Q
2 h5 p& ?1 ~+ K) ]4 r7 z
微信图片_20231015193247.png
5 x! u6 |" u$ d% p/ `* p5 w

- n& W7 j0 J# f$ ~
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
. H5 m6 K6 D4 W+ K7 _& `5 t" c: S# d6 ~' @  _
微信图片_20231015193244.png
# e9 o& I9 ]* c7 \' G( V. x6 k% u2 P7 N1 f0 E0 v
2.2.7 协议栈配置:配置GATT读 服务特征及属性值
5 G4 K- \7 Z6 Q9 ]8 b& c
: G/ a6 c$ l2 A4 e7 l$ S
微信图片_20231015193240.png # {# g* V: k6 W8 f' s1 u6 Y

2 R7 U% c, B. j+ l9 g; z7 O* {2.2.8 协议栈配置:配置GATT通知 服务特征及属性值
( r/ r/ K0 D) j! `& r

6 U7 \3 R) ?1 F  ~; L0 R
微信图片_20231015193238.png
. L2 \  d5 m& \, W/ Z: e/ P

3 ~" {+ T, R# X7 p% c$ R' A1 E4 X
2.2.9 协议栈配置:配置GATT广播参数配置
* ~; Y! Y$ t( \1 _+ I1 E

8 b: {' n1 O0 W3 T' J
微信图片_20231015193234.png
* q' w6 t- ?' P7 t2 W' C

  x  s9 Y8 U2 Z0 a; L
2.2.10 协议栈配置:BLE配对参数设置
3 B+ M, C! {6 M7 O
' O0 Q2 B4 a' [8 q5 E1 K
微信图片_20231015193232.png 8 Z. L8 E9 k% C. J% g

4 Z) O" E6 P' @* R3 V
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
% O5 q! X' |8 y' f8 _

7 E8 _) N- m8 l, y( p) O$ }& h; w
微信图片_20231015193229.png 7 w( S: k* ]" b. u0 @; I2 F( }

( p4 M5 P' v# L2 e+ H. l
2.3 生成工程代码并初步测试
* K3 |) p+ U1 i; f. ?: i
2.3.1 点击“GENERATE CODE”生成工程代码
" R4 B9 g$ r# _8 n' \3 Q0 s
$ I6 c* s4 j+ L4 q
微信图片_20231015193225.png
; ?4 `" x- m( b! e' i
8 U  I) h2 e* U' l
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码2 j1 x( d7 y. q3 \

) Y: N! \4 M/ d* G+ m
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性
: T6 A8 p" ^; O

6 J& j) B% E6 K" p
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。
/ B) s+ m7 o, n5 W
, E6 m$ _2 g% C2 F
微信图片_20231015193223.png : H5 `' P1 a& Y$ _9 J8 J
0 |) S" s  c, ?. g' M! U
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
3 s5 W- [3 I8 f3 U, `

) z; r8 z: a  ?$ t
微信图片_20231015193220.png
$ I1 X1 K6 H. i) @

9 Z: ~4 g8 H2 T' C! u) F
2.4 添加BLE Stack应用代码
: f$ ^/ K/ F: C4 ^7 E6 X# c3 Q
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。' m( S1 e% A& P
7 t8 z5 S" M) l: O
微信图片_20231015193217.png ! [/ T& _' v! d7 P7 I

3 I& r. R0 L4 @# W% l% S; J8 R
BLE应用代码添加:定义用户数据缓存。" A/ {9 Z2 j% ^2 g6 ~) l
在“custom_app.c”文件中定义4个用户缓存区数组。
$ l1 H# P4 R/ P9 x' _+ B
* h) K) u+ ?6 R# w# V% B; V
微信图片_20231015193214.png " u2 ~& F, P0 ]8 I8 t/ w6 ?
' F9 X, y& a. W7 |5 J2 p1 [
BLE事件驱动代码添加:
7 j- ^# ^& J4 H7 C" q4 R# y
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。
6 y. f$ A5 c/ S. _* P; Q. I+ U/ Q

$ t: T2 z' Q/ I, ?$ ]: H0 g6 H; {
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
$ b# H4 [: d* o. u0 y2 l0 ^9 Z
, I- h6 b# z5 |- A6 {4 _& ^
微信图片_20231015193211.png 6 A( I" F" t  m/ I4 ^3 o

. L6 k  K# y) J8 a: |6 V
上图对应的代码文本如下所示:
' N: v  Q( L! z/ c

* `* f! {1 b; T7 \( [
微信图片_20231015193208.png 3 O% E* N: V: R8 X" b
7 `$ M2 j2 n2 Z  l% W! w* Y
微信图片_20231015193205.png # B# W( v; M1 O

' {- u( `' _! i! e0 w3 v% S4 V- W+ T' O  O9 Q
上图对应的代码文本如下图所示:
3 v% {" Y+ w9 F' i; ^

! Z5 Z3 ]2 }; W$ }
微信图片_20231015193202.png 2 g9 d; T! I  q* h
% y  u- O1 t9 A) W
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。  ^3 \. E# {: P# `

, W0 R  ^7 Q3 K  @( Q) ~' k
微信图片_20231015193159.png 3 m: q% e0 W# i# Y5 ]$ l* G) j. s
% {0 \' A1 q: O: q, }
上图对应的代码文本如下图所示:+ Z8 n* I$ s* y/ R  z& H

% o7 ^1 _0 ]9 i# Q/ A1 R/ w
微信图片_20231015193157.png
6 B1 N" p  s* _/ T! G
0 h1 x8 e& z+ L& c. e
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
7 `7 _+ r, X* Y; U
% N+ d  W/ b, ~; S
微信图片_20231015193154.png
7 a9 _( e7 ?' X5 J/ p' @
0 G# x6 B4 q- y: a  [+ A
上图对应的代码文本如下图所示:/ n% y2 ?1 E- A* w! W
: I, K* k  Y" M
微信图片_20231015193151.png
' J  V" m1 u2 N# C3 ~% B

* b8 P2 x. C( E1 d
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
8 E) t+ E* O% c! h
) w  v  a  c/ {( p4 K! A
微信图片_20231015193147.png
: G- p1 R  W) `# }/ K3 J4 X$ P
& Y. \7 l5 `5 a  F1 y2 ~9 n
BLE应用数据代码添加:
$ S0 l. P/ V# ]6 u: T$ G( y' Q: h4 p2 i
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。
- r( V0 @# J; @* o8 t
; K6 U, V9 t+ |9 U3 m" o
微信图片_20231015193144.png
3 F, x8 R/ V. q! P
* y4 ^% R4 j+ e
2.5 修改BLE最大数据包传输长度
! @4 K" j) i5 W: M
如果不修改,BLE单包长度最大仅为23字节0 y: t+ @' z0 |4 d
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)
. D6 U0 g# l: C9 Y" q$ V: J

) s( X& B+ `- u' u0 W( d, J
微信图片_20231015193141.png
% e: N- C7 i$ h% J9 n$ V
1 \; O/ |5 O; s( c% L9 l5 q, n
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。
* a5 l7 }2 }- R  ~! q, C0 S
4 w8 \" ~9 _# }  g) [
微信图片_20231015193138.png
( e, i8 C: d: l+ \& _- L9 W  e7 [6 [6 R

9 L9 E' }; c% P) ?* ]2 F
至此,所有代码更改完成。
' d5 |1 M3 V! {9 {1 h4 D( Y+ x" s6 n0 G9 }1 Z( J" m8 E
" J! g' N8 F  x! r
03测试平台搭建及功能测试
' X- u% E  o* J4 e! Z+ U
" H$ D) [5 z; ^  d' G; b- i
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)
( [( O- K2 L4 s" U0 w
& C4 |: ^' P$ G6 ]& d! m' K
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的
0 s  p+ `' v' u4 h' G& l$ R5 w+ E
8 z2 v2 i. v# A: [# y% A" M
微信图片_20231015193134.png
* ]% X3 @/ L, ?9 i& X

; g: Y9 y/ O, ~3 S" D' O
查看当前FUS版本,并将FUS升级到最新版本" l. T7 F- S$ `& B/ i/ C
; |! p0 \% b9 D! f. \
微信图片_20231015193131.png
9 h0 e& t' v6 z% I7 _% n# E; ^; k

5 u% j- U; v; S
如果当前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”。
* ?% \) V7 p1 x
# K; u/ Q& \! s( v2 Z$ N. @
微信图片_20231015193128.png
, G; X+ Q: f' ?0 {0 b' o
4 E5 T! e% F, f9 e
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
; c; ?0 H) }5 p; z  R
. M# I3 L1 J; z1 Q0 T
微信图片_20231015193124.png ' W- f6 i1 p/ W4 w0 s
7 y: d' R# v  Q& R+ e
3.2 测试平台搭建及验证
; l% d- o. k- N4 |! O

4 K' Z3 w/ S/ y& ]1 u2 V
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
' }0 O7 }. j; D

: R  w3 m2 `8 c
微信图片_20231015193121.png
: i6 b. J" ]  q/ |
" K5 @! }4 n) A
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。- D- Y" q9 [# d4 {

; o( h( G3 f7 f% k
微信图片_20231015193118.png * H( W# a5 n3 B5 `
! f, b. D. c1 A
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。
* z6 A% Q0 @2 Q: R3 B7 M/ w# _) Z9 b$ z) {
微信图片_20231015193115.png
2 D7 s5 g$ C  r. B
' Y3 ]2 b$ L' J! {) ?
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
7 e: r& i9 Z0 ?
; {( U  b; Y- o0 }. [; J/ x6 S
微信图片_20231015193104.png 5 Q' O! E- o0 e' m4 D

5 [0 l8 a, [4 P: \; D
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试; b7 Y' X7 _/ S2 u# Z9 E
9 m& M# y) _: @
微信图片_20231015193101.png % j6 I6 Y4 F$ z& d1 u
! Y' r4 ?* z7 @% S( V6 @! O& Q
3.2.6 手机App写User_Write_Data[64]测试/ v+ H# P+ t5 o5 w- D, y# X

$ U' G0 R# \& `
微信图片_20231015193057.png ) m) Q' ^8 U4 ~& x% a3 `" ]
8 c( `! Y* n8 y  g3 ~
3.2.7 手机App读User_Read_Data[64]测试。9 M! G; r% ^* U' H9 T" I! p/ V
. Q8 ?6 e& f, E0 J: U8 L. b* k: U
微信图片_20231015193054.png - e& i( S9 S8 o  h

4 l6 ^  G5 a) Q+ m
3.2.8 通知数据访问(User_Notify_Data[64])测试
) s+ A$ K4 c7 U6 B5 U' q4 }5 m
' u& D2 a; w$ t( h% \( t5 U, K( D
微信图片_20231015193051.png 7 {+ t' _  S7 M) E" A" r, A# s8 K, M

( I6 R1 s6 F2 B3 }+ C8 j
至此,整个验证和测试过程完成。/ g1 m* a& e3 v
3 B% n8 v$ y2 v+ t
' I# R! a1 `, Y5 C, j* j
04小结
( k& |6 ~' @4 \5 ~& ~  c2 B, `( A
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。& O' L* P6 U1 n( R) ?! b& X
) [7 T8 Q) x- A* z, @  I2 ?
- o/ M- C5 ]' ^9 k# I
, G/ {+ s0 L- F
转载自: STM32单片机% C+ y( `1 ?) ]9 R

( T7 `6 G4 D7 u. l3 L# D, d$ V
收藏 评论0 发布时间:2023-10-15 19:34

举报

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