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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言! [$ k" u8 V1 R/ t

" p* |0 P: ?& H$ O5 N5 `3 cSTM32WB55是一款支持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是能实现上述功能的。
6 B/ n, _3 X4 n7 {( s

, g. Y6 ?6 z) B
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。
0 y2 c3 {2 o6 H* G6 c7 `% [
5 g* `; Q: A) Y+ L, d
微信图片_20231015193351.png - X: q% T; g% f# V3 v2 K1 Z. }  Y

. p5 e' r2 D8 W8 @
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景. ?/ W  C2 W: A1 H9 D
- {% m) s( @4 k% E) P( D9 _1 H

( X, r8 K; d9 b. f" }' O4 m8 Y
02STM32CubeMX实现步骤
1 ?& F8 e) a% M0 T( R. L, b
9 n$ p$ S1 t- c' ?" O2 v; l
2.1 创建BLE工程添加并配置外设  M  g- j2 f/ a: f- T& W5 c
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
8 l  }& q1 n9 d7 g: Y2 L/ |& s

; f+ T! t8 d: ?9 A) J
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程
4 u  E* |+ H) L6 ~! |+ b+ F# r% H

- g# C, ?3 a' U, o! ~
微信图片_20231015193348.png
) O3 y" s4 ?$ E' ~7 f( P+ z

  B, B+ Y/ [" g4 J5 J2 j7 ?
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
( y4 o( e- Q. Q9 P9 N$ q8 @& p
7 p6 p( n! A) a- x0 V
微信图片_20231015193343.png
$ g. k2 A# V" b  c" ]' z

7 P/ i# A# O3 H: G+ _" a& L8 W
2.1.3 系统配置:调试口
  d% x8 Q4 {8 @, p
& D: z, [+ g/ a6 g
微信图片_20231015193339.png " o9 }$ p/ W  Y% v! a
/ K# g7 c) B% ~  X& _
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
$ t7 K# F& @1 c2 `! c; ^2 y; U1 G, N9 r

3 ?( k" J; h% `0 _% S. Y
微信图片_20231015193336.png : x) M8 T& F& f, @6 f) w
- y! L4 {& z5 E1 ^

$ R1 w6 Z( W7 o9 g+ d4 S2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
2 b: ]8 l$ h3 h, M# `' d
5 J5 G) T9 H* e, h
微信图片_20231015193332.png $ Y9 b! ~9 d, R5 u+ G+ i. e. t
使能USART1的TX的DMA功能和USART1的全局中断  `& P' y0 ?, l/ f! X" Z
0 ^# u5 Y7 b2 F& Z2 Y
微信图片_20231015193329.png 1 k2 A, z0 B$ Q7 [! n
# m' ^3 Z( K2 r. d
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
) P7 C0 u: `' S  Q
0 v1 C) F8 m- ?3 c2 L
微信图片_20231015193326.png
' v0 E% p% p/ ~" {, ~* G

- B$ J* p: k0 N" K) ]# w/ m
0 o. e9 q: C$ Y- g/ m
2.1.7 外设配置:使能RF,它完全由BLE stack管理。. g. s6 \' \) i) R! @2 J4 Q
* ^# p- o5 z1 B$ D) t
微信图片_20231015193320.png : E( c/ t' M2 P3 Z  ^( j" m
7 P- n3 J0 o. S4 T: t/ e1 m5 x2 B
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
5 h9 V4 L- G5 K& v
6 c; X; ^; U1 l$ s% ~5 Z/ B
微信图片_20231015193316.png , b3 _( x/ @7 p# _, ~3 R
4 h1 W4 V; J$ n4 n7 [+ {+ a2 p! A5 B
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。$ _; s- Y: Q1 o* f4 O+ T/ F
1 O. D: d& S* p6 s* _. r/ T, r' ^
微信图片_20231015193313.png % y2 R' U+ c0 T& _( s7 `% J. q4 H+ `
: B( H) c2 r2 ?/ A1 O+ D
2.1.10 外设配置:配置时钟9 b& _9 Q! Z8 s/ O; @5 d! }

# L2 y5 r+ E! N! G; ^
微信图片_20231015193308.png ; ^' B6 T( P3 `; t; n
3 u$ r5 {8 ?. d; l
2.1.11 外设配置:NVIC的配置2 h3 R( t3 r0 g2 j2 P' `

; F9 B9 \! X& j
微信图片_20231015193305.png
9 }$ b4 V8 v; ~5 K! p8 {

* N: h6 S' _; A: C, s
至此,外设的配置和添加部分已经完成。9 e$ W# }) D+ i: |( x
" c$ w% Q3 B5 L
* y0 k+ S) A! W. [! X* C
2.2 BLE协议栈的添加及配置
) [2 D$ v5 ]3 I" V" @
2.2.1 协议栈配置:使能BLE协议栈. C1 k0 L7 p6 `5 z6 R2 A
$ R/ c2 T# S. J+ l& l- n
微信图片_20231015193301.png % F8 m1 F7 k1 w/ d. V
' r& B5 W/ B) Y+ v" G4 f. M7 s
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板
0 Q3 Z; x5 k$ _6 H( E

& A2 @+ s9 A, e  W
微信图片_20231015193258.png
9 S9 z) a3 r) X$ x. {- c1 g: M
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"
! ]( X3 z, x$ L5 p. V' h0 X; ^
/ m8 y% H( f+ w# ^5 Q
微信图片_20231015193255.png 1 C( V2 j* m( T+ S# u1 h

" {6 z+ B* q5 U' O
2.2.4 协议栈配置:GATT服务基本配置
$ H3 @1 t" ]  }' S0 [5 O1 k" ^% ?3 U1 d
微信图片_20231015193251.png # l/ @" F8 p( M$ D

7 S: w1 `/ O& c" R+ Y
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值
: t) ^! ]( S- v8 l: a' J

2 e7 F, Z; ]9 ~  r
微信图片_20231015193247.png
5 K( P: Q2 k0 u9 t

4 M! X" G& ?$ @7 d
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
) q! t( H" Z" Y, x7 q4 S4 v/ ?& k( s$ @& R" p" T- I' |* r
微信图片_20231015193244.png " `7 {) V6 n$ h3 {
" K. t0 H4 q# M+ i8 Z* K/ g' L# \+ g
2.2.7 协议栈配置:配置GATT读 服务特征及属性值9 |! V+ |, W0 c; ^, o. ]; h& l8 F
1 g$ {1 @" L* Q" V. d
微信图片_20231015193240.png
' W' ~: G. D% ?: o5 A* K0 r9 @# z; H8 O. l3 H: ~
2.2.8 协议栈配置:配置GATT通知 服务特征及属性值
* }- y/ P1 H8 t3 x  E

) l' Z( K/ G( e  \5 K  H
微信图片_20231015193238.png
& y8 R7 @* D5 D- @; I0 V

" N! ^1 |* r! T3 i8 s2 I
2.2.9 协议栈配置:配置GATT广播参数配置4 D; u* @  W6 M

2 H- d0 H" E( B8 u9 j" n
微信图片_20231015193234.png 6 M% C* c. A: z& N

/ l( K% l7 o" V2 p; O7 J
2.2.10 协议栈配置:BLE配对参数设置+ F" {5 U& K) M1 b

) v# n& {( P$ L* s
微信图片_20231015193232.png . Y! M5 M6 e9 g) Q8 D

4 `0 n2 L* m  R
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)
1 w* x/ c, D7 r" e% g/ r# n: P0 B
& D$ G! _7 X4 Q- _) v
微信图片_20231015193229.png * E5 l  _9 K6 z+ q
3 N& l6 l, H# W; I: u6 q
2.3 生成工程代码并初步测试
7 \7 D* O9 A. T) b% h
2.3.1 点击“GENERATE CODE”生成工程代码
! H. y" M% I7 C( n
- j3 v9 C  p- j) B: ^
微信图片_20231015193225.png # ?/ @4 X1 r$ o. H' ~' K5 _+ V( I
, e) @* d/ G5 p& N/ S: Y
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码
+ y: S* V  {& j9 p) h
9 k* y4 U9 y9 V* `- o, x( [# u
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性# h, a5 n- D4 p' L
* X& P2 n0 r* ~* A& i3 Y
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。# a2 }; {0 m8 V, l( y. c) h
! J$ X$ ?7 `  b
微信图片_20231015193223.png
% j, d5 M2 ]+ h
0 J! N7 o, n" Y1 q8 a& n, e3 y" {
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
0 i: T* ?" D2 B" p' l6 e

  v9 X. Y( g2 V9 q- I  c
微信图片_20231015193220.png
* M8 l% S% O: l" c
, g( o. I* A  L3 K
2.4 添加BLE Stack应用代码4 W2 b' N+ Z& ^  Z* K; ?) ?
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。% w+ v/ ~$ h& m7 ]
4 [1 o+ ^/ y& o( l9 g
微信图片_20231015193217.png   m$ v) M5 G0 w: ?

  b( s& @9 v$ N/ M
BLE应用代码添加:定义用户数据缓存。1 P) I8 _- l; b; P
在“custom_app.c”文件中定义4个用户缓存区数组。
+ Q) e% c) G2 Y8 |4 Z7 G" c

, i  v6 o3 b8 S3 a- Q8 l
微信图片_20231015193214.png
3 k" M. K' _7 Q/ J
8 G* P+ D; Q  j! Z0 D6 D5 m9 ?& i
BLE事件驱动代码添加:

7 G3 R) R( m& j3 j0 v
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。, i9 K$ ]( u$ `( G2 C3 S

, ~* ]) d( {9 d( _$ G, ~
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
6 ~0 ~" m: C  K0 |
- ^. [; z3 f+ j9 M' y
微信图片_20231015193211.png
4 o8 w2 y3 [5 a/ x% P

* }. n: b7 O- C& B, o+ J$ O' v# q
上图对应的代码文本如下所示:
) e3 _  X) ]: a1 U& E5 e
* ^! E6 N# P- S+ Y
微信图片_20231015193208.png ; s; v$ I3 O* C0 P! k* K. q

$ s* K  }* g& z- _ 微信图片_20231015193205.png
- ?4 p5 O( \, R( X" N4 d6 D9 [2 D- F2 v8 w' o0 W& i$ T. ~

  ^( h9 n* \& H/ M
上图对应的代码文本如下图所示:) z& \2 p5 W! [
. |5 x& u  g2 K6 F$ c: j
微信图片_20231015193202.png 5 L! K) }  g$ Y

+ t1 c0 R# m6 C" c/ C" U: S4 Y& i
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。
  N/ @! Z. I* g7 o8 c: M2 ^
) A0 C# y: e* Y( P* {# b
微信图片_20231015193159.png , y7 S( H# s9 L. {. X5 d2 W5 u6 l
4 e1 s9 D' x9 ^7 `9 @
上图对应的代码文本如下图所示:
5 O; t; ]0 d* q# E3 K

4 B' N) C9 O- D) Q  v
微信图片_20231015193157.png
( {. ?- w9 I4 }! q

+ Y; d) i* _# ]7 H/ {
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码4 [  |1 M. n/ x6 ]) q
% @1 p" V- d4 b5 N+ l  L4 ~. C
微信图片_20231015193154.png ' T, ?9 I' Y4 t" m( u

1 H- ?3 }' \9 W3 x. h( U: u( z
上图对应的代码文本如下图所示:
+ i. G1 l* L4 c5 u
% h! |5 E2 n% X
微信图片_20231015193151.png
* i3 S. \- |( y7 w1 C1 \
- a/ s" f% k! X( |5 R
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。- l; g4 u. P  B1 ~  V: G5 @

. I6 n* o, @9 V' a5 P
微信图片_20231015193147.png
3 s4 R( {/ N; _9 Z! R1 y  c6 V

8 U; r" b7 i! r$ u# k
BLE应用数据代码添加:
. {5 u1 o/ G& _( d
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。
* @* O) k  }$ \2 O2 @
9 d2 ^) _, f# b
微信图片_20231015193144.png / F. P0 }6 c9 R: n

7 c  \& T, t8 T  C: s
2.5 修改BLE最大数据包传输长度

, k; v3 ]9 c: l: i8 m2 T" v" a
如果不修改,BLE单包长度最大仅为23字节
5 a. _2 g  p% X. J8 [( ^( l7 d% y
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU)# C0 _* F/ A+ y( _5 n

) U. f! d8 E7 ^& }
微信图片_20231015193141.png 8 }) r* s- @; k9 u3 x. k9 T" j

1 u4 s4 @$ X2 s: N. D2 o/ q2 P7 |" ?
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。6 a# p0 ~: r% s9 E# l. B6 Q

$ ]  w" m" m4 ^2 c
微信图片_20231015193138.png 9 K- _; i1 |0 n( F. Z% }4 g3 Q! d8 R
: H' F; C9 E' i$ d3 g+ r2 i+ W
至此,所有代码更改完成。
7 i- Q' J" Q- G: v' \4 a0 u- k3 D* P. k/ }$ ?

2 t7 y7 D( R, B# @
03测试平台搭建及功能测试
1 ?8 o$ P3 R5 M5 A
1 W; V+ T. t0 Q- t" w5 ~
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)
& b6 c# D: c& R; o
4 t8 t. ^" q: d- a- N
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的* [' }6 g$ k/ z+ H, J

# i8 J9 w3 S! O# v6 A0 X5 h' J
微信图片_20231015193134.png
1 \7 O% [6 s$ @7 C5 G0 m
: U7 J$ z, C2 X/ @( C8 Y
查看当前FUS版本,并将FUS升级到最新版本$ m' k; d+ _3 j3 Q5 R+ f7 f

: B* ]+ L1 d5 Y" c: R2 I2 V
微信图片_20231015193131.png 9 U  B" h& \0 O% R, Z* U

( t9 T6 _( h2 Z& E: u
如果当前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* w% O0 i) [, G: m

' T% v, k0 q- K! U
微信图片_20231015193128.png 3 B0 f3 m6 i5 [1 ^& v4 C. N3 ]
( w$ m  y$ c! S2 _; v
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
9 A. Y" M. b3 E+ j( p+ A

/ q6 b6 W; M+ |4 J' [3 ^
微信图片_20231015193124.png
) K: d) E3 v: y1 x" \

6 t8 w( s2 J5 q4 a, N
3.2 测试平台搭建及验证
; F: ?6 t$ X% H1 j5 S; Z9 e3 s0 D
' k% j  T/ s% a2 b
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
/ u0 N) q% `! V
+ h8 A1 L4 |7 ?
微信图片_20231015193121.png
8 a- J; j- h- L  m* h
3 G, I6 m' u0 R' F
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。$ C! M/ g/ z6 T- _. \3 p3 f

4 H; A- z+ s, T
微信图片_20231015193118.png 6 e7 H1 \: W9 }& O% w: L
% l& q7 [  s8 o' O
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。
+ v; _! y/ @0 L" R& W
" h# y( J& |& l6 ^: q
微信图片_20231015193115.png
( N4 a1 U6 u+ ?7 G: q# T7 F/ [

) I3 j. ]) l7 `) e$ P
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试. j8 y! N( ?1 \6 ?7 Z
* b; V5 d! B4 }) X
微信图片_20231015193104.png
7 V( L* j8 g8 ~! o

$ o$ E# e; Y5 I4 u- ~( P% F
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试& D) \, N7 J1 o

- j  `* M2 H3 b2 N0 o
微信图片_20231015193101.png
/ |$ @: O. B; Z

, z( i: K# E2 u5 u$ {
3.2.6 手机App写User_Write_Data[64]测试: c" q: Y2 x1 J( f, K

8 R& U, v: u+ V0 U3 {
微信图片_20231015193057.png
; ~' {6 V6 b' k8 C
7 [/ w1 r: q$ m5 E
3.2.7 手机App读User_Read_Data[64]测试。4 f' p- F+ H  z& f# s/ W
: x. @# J  x% c9 p
微信图片_20231015193054.png 4 \% c2 D0 q% c' u; v( j3 \

7 W& Y  I* B1 H( b' O. l
3.2.8 通知数据访问(User_Notify_Data[64])测试) c! T5 G) j0 H6 T( k  ^

7 K  d. X5 k$ Q* M( E2 H
微信图片_20231015193051.png 1 U# T4 e! }( P& M& Z5 a

' T/ c% ^' m% ]. r( H/ K/ O$ a
至此,整个验证和测试过程完成。
" B; l) p- d$ I7 z7 N: d! X
! s- x2 D' x& K" ^4 j
8 P% Z$ {$ X# j* W8 r7 ~- d3 i6 }
04小结3 z. J0 c  f. B; s4 z1 M: f
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。
+ W/ b. F9 X8 p+ R3 P2 b0 x: Q& f) _
: h4 E3 I0 _9 u  h. O( s& S8 |
2 q- Q3 Z4 l  V+ U' x

* [" f; z' w) B* R6 }  {* l# l转载自: STM32单片机; z8 ]5 Y/ B; J" E
0 p  {2 N  `. i! e6 x# R
1 收藏 评论1 发布时间:2023-10-15 19:34

举报

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

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

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版