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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言4 H* g% S* J; X' Y8 B2 J

& i# J3 r) B" p) wSTM32WB55是一款支持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是能实现上述功能的。
& {% ^4 w( z* {. j

2 A1 N/ d9 p7 b: Q
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。( i5 ]' u3 q3 R6 J
1 B+ C3 q7 j" r9 P/ j$ C+ ~( w
微信图片_20231015193351.png 4 A, }( R, k  L1 X- Q! v+ q
, M7 w/ m5 |' l- A4 J  j* q
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景
. |. d; Q9 J6 d/ F
9 k8 z6 |6 u$ s
& A0 u! X7 R! \, u( y( ^- t3 x3 p) y7 l
02STM32CubeMX实现步骤/ b2 k! A( _& J  e7 s; ^

9 @. p% h) N9 X$ ^
2.1 创建BLE工程添加并配置外设
2 l; ]2 F( c& _& U
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
4 y# E& D. L4 J% }, B4 Q! b
8 u6 M) n2 O4 L2 |5 F
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程7 n: `, ]1 e4 m* U

3 N/ F# l: G5 F6 C; v5 I8 }
微信图片_20231015193348.png - H5 u, v' k5 N

. R3 q& z2 ^( r2 y1 g& z
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。
  y  c4 x9 Z4 P  Z; ?; e
$ N& u8 _# |: ?0 }7 o9 b8 [% _$ }
微信图片_20231015193343.png
  |1 k; g% X0 [7 G/ |5 L

, j5 U- }! Z$ d' {4 `6 e
2.1.3 系统配置:调试口

8 p+ b* L0 `. D0 I$ q4 L/ T9 P# E$ e: T
微信图片_20231015193339.png & x2 i0 P/ H, Y8 j. E+ n" f

+ m, F7 M: @+ f4 z+ m
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
. c6 g: h- F" l! N

; l) e. n8 {' T4 D
微信图片_20231015193336.png 3 u6 b. P! q  h- v/ s$ n

. ^) Q' _6 O6 _! O2 m( ]
4 i7 j. {7 X$ w5 G$ h5 a6 B, r2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
4 W- A1 H6 {# j* ^

& }7 B/ L7 o: y( K' v2 ~
微信图片_20231015193332.png
' z) M0 |/ j0 u& v
使能USART1的TX的DMA功能和USART1的全局中断) Z7 g' y1 p) v" X0 t& I4 Q6 k
6 G' l+ M9 v, x% M9 L3 e2 _/ S
微信图片_20231015193329.png ; M; o2 k8 [0 \  X" F! R  [
/ j: w8 J7 M5 M, q( i1 Z
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
6 |- y& R# q3 O5 E5 j0 C

# Y5 h, _- @3 g/ B, h
微信图片_20231015193326.png
# K5 P% U/ a# P5 |6 s: j; \) u

- @1 H+ x3 X" ^& w8 b4 ^1 I1 @
) r  r7 x9 B( A$ F3 R
2.1.7 外设配置:使能RF,它完全由BLE stack管理。
) |( N& w4 L7 r) }; p8 b

8 X/ v+ E4 Q" n
微信图片_20231015193320.png 6 O. [+ z& B- x6 N6 s3 R" B2 o" u
. z+ t# Y* n$ p) X  J7 d( ~
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。
2 [1 _7 o% c) x5 @" m
  h- P$ c: A$ K2 p
微信图片_20231015193316.png 6 ]" E  s0 f( Q3 l8 s& k8 G( b( x
7 b9 W. [! Z+ E8 y. g
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。" m$ S" Q- _- Y- L
2 P" W% _* }1 S" ]2 [8 W* d. }! ]
微信图片_20231015193313.png $ V. R8 C7 ~( x9 ^7 v' Z8 O

. X3 l: m- i" Y/ m2 {
2.1.10 外设配置:配置时钟% [% P) ~6 I1 `: w( P$ O
* E6 j8 O* u" w3 j) ?  u
微信图片_20231015193308.png
! R1 S) Y# ~9 Q# Q& U& p0 P

* S8 a' {& _7 C+ i3 M' q* ?$ y3 R1 X
2.1.11 外设配置:NVIC的配置
3 G" _. f% O: j8 A

& P5 Q, g# z; z
微信图片_20231015193305.png ; x$ o0 O. x7 u# W$ v
, i! Z7 n0 n( B6 \$ }
至此,外设的配置和添加部分已经完成。' f- w, ~3 [5 E# b; b/ p3 x

3 v2 e2 a, {' X

6 G2 x/ R; W4 h1 h7 u- v
2.2 BLE协议栈的添加及配置  C+ z7 |* W, I- E9 K* q
2.2.1 协议栈配置:使能BLE协议栈. o. T' ~7 s- m1 g# F& g9 T! Q( v
2 R+ O* }: M; Y5 x. _
微信图片_20231015193301.png 9 p( s" X: B, P% n; d

+ J5 P# b3 M& w% @9 E% E, F
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板0 j. X' C* ^4 }; C# I7 `3 ~

- l: p  F! p& p! P. E# Y3 L5 ~
微信图片_20231015193258.png $ U3 j3 Y: |* H! R1 Y& W) v
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"+ a! r# B  d3 f7 X2 g5 U8 l( x- q+ s
* J% j# R$ X$ P2 I
微信图片_20231015193255.png
' K  N$ W, L# D; B
3 l  a; M! \* |3 J$ @/ ]3 l
2.2.4 协议栈配置:GATT服务基本配置
+ o: y* x6 p0 P5 t' K( Z
' B0 D+ c( d& D8 B* T  ~
微信图片_20231015193251.png
7 C- }" y; X6 {4 w' L! m

3 U4 B! D$ o: k5 a0 O
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值+ b- g* j3 Z9 K" H3 e" Y. ~

2 n: J7 T3 p# k0 {/ l
微信图片_20231015193247.png
+ d& {$ ?! E: u" r0 W

" l: }5 O5 h7 w6 Z, n* l5 e+ B1 t
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
! H  M2 }, ]; o0 [* K) b  D# ^6 M' n* L. t
微信图片_20231015193244.png
" P0 q+ E8 R( `3 o
0 ^! ?% H( g4 T3 l, Z2.2.7 协议栈配置:配置GATT读 服务特征及属性值
1 z, c! s, h' X+ V) {) v* P, a: z# A% A5 A
微信图片_20231015193240.png
3 H3 V' J5 g& v3 J9 r  L- b" b2 I/ I- w9 e
2.2.8 协议栈配置:配置GATT通知 服务特征及属性值
/ ?  B! M. q$ [
8 N/ M( y" Y: C( S0 {
微信图片_20231015193238.png
+ D% I. `+ G* N) _5 w
% s/ b' }8 \) _4 g$ b
2.2.9 协议栈配置:配置GATT广播参数配置
+ J  F5 y4 S: N  Z3 ?

( B! p/ I' @4 t2 f+ ~/ }
微信图片_20231015193234.png
4 y& c* Q4 h' C9 Q

" L4 p- S( g% N* C; k" O  M
2.2.10 协议栈配置:BLE配对参数设置
2 N9 @  ^, l  x' ~: h
( {+ J' q! q& d( O6 {: E. B- G) j3 `
微信图片_20231015193232.png ! U- a$ Y: K& c% `
3 g. x0 q/ ^$ I+ z# U' I
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)( {0 w/ C' c# d4 _# a

6 \: @3 V. |% Y5 d8 _& P/ a( f
微信图片_20231015193229.png
- y6 q3 e6 G! D9 T% M& x

2 f/ U# n% o! Q# T9 A' A4 C
2.3 生成工程代码并初步测试
3 U' e. i; `8 t+ @( k6 p
2.3.1 点击“GENERATE CODE”生成工程代码
$ e. j' A( [" E, D7 P" f1 f

! Z1 ^3 {( g" \0 F7 w
微信图片_20231015193225.png ' t3 z1 g* c$ \( r$ v5 l4 Q' C" K
: v% j5 c5 z8 Y
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码
) V8 E4 P/ e* g

$ D$ b/ p: \# _4 M
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性
" A- H+ F/ G; ], \9 ~, B# j

! j* Z' ]0 \7 e  r# y+ w
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。$ ]. B4 K+ f4 M' \6 a

) Z+ q, P& o. j! {' d3 r& M
微信图片_20231015193223.png 3 n, x5 Y0 a; d5 @& J
. w0 ]' }0 ^/ _3 t2 ?8 E8 ^0 O$ M
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。
. J6 j* L' ]" c
* W+ i2 L# i2 Z. g. k! d6 {: I
微信图片_20231015193220.png
% y$ c' Q+ Q+ R3 T* I# l2 j4 t: X/ g

, c0 a( G% n8 k+ b, }) I! }: I
2.4 添加BLE Stack应用代码
8 k# P7 R& C' Q" M2 s$ [
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。, N* X" b6 J  T9 {7 w: P
! z/ k2 J( x4 Q0 S+ z1 m2 @: q& K
微信图片_20231015193217.png 5 d1 o* b+ Q; ~/ \  y
$ y! E4 k4 Y: |9 H1 u
BLE应用代码添加:定义用户数据缓存。
! {* l, p3 j2 A% c. t
在“custom_app.c”文件中定义4个用户缓存区数组。
  t5 i9 J5 u' x: q
. U; h4 d" }5 f) J& [2 z7 D
微信图片_20231015193214.png
, N0 O0 c" B1 p3 u3 E; l

, v- Y/ g7 J' O
BLE事件驱动代码添加:
3 I1 U$ v+ U* g% m) n
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。8 ^) h  Y/ a& u2 p
! K9 X0 d" h. L+ h/ X
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
. j9 P  @: m& c4 P1 t

$ O8 @; @+ S( u. M
微信图片_20231015193211.png ( T4 \8 a# s1 Y

# x1 f- J" i# u9 H4 v/ N9 L6 g* J6 |
上图对应的代码文本如下所示:
% T6 v1 K) ~" `* a% D) Z

1 Y3 Q8 l$ t+ k& c
微信图片_20231015193208.png 7 y% E# j' x. B; t& R* o# s

# ^/ S9 O7 Q) b  E9 d6 D; O6 P 微信图片_20231015193205.png : V& j4 \5 T+ D
' K6 V( y7 O% G, f# D* b* W

0 l9 O8 A; N: g* u9 X: @
上图对应的代码文本如下图所示:
( H' T) u# {- u' z$ E  P

* H# D# Z5 e7 E" H( e+ M3 T
微信图片_20231015193202.png % i5 b8 l% h8 R) ?

9 T: J& _; a. \4 Z5 E
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。
. `2 _3 h( ^! Y0 ^# E5 R
- G7 r( x' g6 m
微信图片_20231015193159.png 2 w" b6 W, z7 w( j5 l

! p3 S8 @% c) X% {
上图对应的代码文本如下图所示:
' a$ ?$ F; p- ^; }

7 H# J! N% i& U8 G7 S% ^( p% h
微信图片_20231015193157.png " y9 O2 `1 [7 a7 G1 ~$ ~4 u) o

. z, p2 R8 o1 g, _8 N" j5 e2 S
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
) s: U% ?: m5 u- Q# |- @0 {
! J5 h  @# Y- t! b! I3 I! l
微信图片_20231015193154.png 0 h5 Y7 O( [; [; D2 q5 p

! O% b/ [- n& f" c& x
上图对应的代码文本如下图所示:
, p+ m* B+ P/ \6 i( A7 p0 v

( t5 Q# ~" ~4 i! u$ k
微信图片_20231015193151.png
/ q, I  k3 Y! |0 i4 @! M: v/ ^% P
  |$ ]9 |, p, ?
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。
" L6 @% G! w2 s% Q% v
, Q; [  c6 ~* M* O
微信图片_20231015193147.png 2 t0 p5 w) h% T& c$ r2 |

" q6 ~2 t3 L2 x# g3 t& \
BLE应用数据代码添加:
8 o3 }6 d0 G. @( B& I5 p" x
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。+ I0 y/ L- J2 Z5 k8 U# w

. J0 i! S: N/ P
微信图片_20231015193144.png
/ d/ A, V1 k; y- x9 \

. R, J' J$ R* Y
2.5 修改BLE最大数据包传输长度
0 s4 C! |/ V7 _. o
如果不修改,BLE单包长度最大仅为23字节0 o: H8 d( n) e1 i& L% z: I$ ]6 {
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU). w# S( U$ A: a$ p1 \4 i2 K6 O0 _5 u2 I

7 f$ e, f8 g: t& J: k$ H$ S  |
微信图片_20231015193141.png
; e7 i/ t1 a: ~# H2 v$ W9 L
$ l( n; ^* ^$ p% x
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。5 k3 {2 o/ ?* s& t

# ^/ m# r$ L3 {
微信图片_20231015193138.png # @, _: s2 ?. M: g$ g* S
! k3 Z) s1 [! m6 c; U1 J
至此,所有代码更改完成。
1 J7 ?+ J- g% ^; d, d+ G; E$ B9 Z: n5 l: E, ]! j

4 |0 X, g4 k$ U( G: Y1 C) R
03测试平台搭建及功能测试& R8 p2 \' I, y7 V& m5 O
' ?" Z; m  q7 t' u
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)

5 |- @. V: O* P- o6 u$ F& p/ z5 G

% p9 T- J7 D4 F  f
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的
7 {  O# p- O0 |' b" B" F, ]
) c# n2 U; \% a2 s3 v
微信图片_20231015193134.png
4 I8 C7 u; Y4 ]" z! d. a

( y$ F5 k/ R  N1 [) C
查看当前FUS版本,并将FUS升级到最新版本
4 E4 k# x9 R/ w+ {, b; D
+ N8 I- u2 {4 Q4 @6 e2 w6 h) Y3 R3 \
微信图片_20231015193131.png
  q! y* H* @$ ^" Q9 g4 r) O* M
1 v7 c9 g" ~2 ]/ 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”。, c. m8 W+ X, Y, o- u% t

7 |; x, o7 R* `
微信图片_20231015193128.png 6 {, ?8 H% v  J2 x- d% ^7 I3 i5 T9 i

, u) V- e# I8 G# y4 ]: k
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址5 n& t4 g: G: V

' T4 p( ]% Y, C% s. B: z3 U
微信图片_20231015193124.png : ~. F1 w( p, Q3 z1 J  X
: D! k6 t3 k" X0 v7 H
3.2 测试平台搭建及验证) `7 A6 \$ u2 h' o. N
+ G( v7 v4 k) q" W
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”
) F0 J: w0 W( g/ Q" n# m

1 F; R+ v; ~0 o3 L  b/ e
微信图片_20231015193121.png . d; D% K6 p+ ]& ^. h
9 ^7 Y% V% w) e$ L3 q4 L/ X/ r" D
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。
2 z4 ?' e: o7 |

( T9 m0 F, [* [0 c2 m. s' k
微信图片_20231015193118.png " v$ \: B6 v8 k2 ?! M, x. I; z: D

( U; }1 N. h( b: @3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。
& A( a% V% S+ B+ o+ T- F0 }; z: k& g8 x! [9 F7 ^. x
微信图片_20231015193115.png
6 g# n. n: k1 ?, R# B
) x2 Q2 y  @: K2 s! m
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试
- P2 D" m, I& v9 T" i1 {
- V+ N% A: V+ U8 s: R9 A3 K
微信图片_20231015193104.png 3 V1 {; O) ^3 n0 P1 @
5 d% Z  T& a0 D9 a  j
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试
, c$ `) c8 z" S* T' M/ J+ _
; x9 k0 L. U- C% z8 d
微信图片_20231015193101.png 1 Q- w, O+ T+ @  ^

% B4 ^1 y- I' {5 F, S; l
3.2.6 手机App写User_Write_Data[64]测试
6 {8 o2 r( e* ~6 w# q# V# L' p& V

  \- v* O: W- K& I) [  f5 L
微信图片_20231015193057.png % g! Y& ]4 p5 e' V
+ f- I& z# D, c7 |6 S
3.2.7 手机App读User_Read_Data[64]测试。; J  k) W! D/ W6 r6 @
3 }6 f! ]4 n& z/ {4 E
微信图片_20231015193054.png + T1 O8 {  Z+ v5 K# }0 F
: `3 s) P9 ~# C, l' e$ t$ Q
3.2.8 通知数据访问(User_Notify_Data[64])测试
& ]7 j" O9 h6 O6 w/ t- K" {

9 |0 o8 t; M5 k! e
微信图片_20231015193051.png . W# r* V* p4 ~" ?$ v$ X9 Q- Q
; [5 w1 r4 x  [, p
至此,整个验证和测试过程完成。
; J7 V1 v4 _. t. E2 D
2 }: g3 M5 V1 ^

1 @) S" P+ x( T& r3 X
04小结
6 Q- M2 K! r2 P4 L5 \) g
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。4 D) e2 ]% ^! p" R- k+ ]: }* D
9 j' f6 p% N& T5 v
& m$ T" E( P4 I0 w/ n) q9 U3 f
1 g# Y( }) g" |9 l4 u" U5 n% {
转载自: STM32单片机
" x, y8 ?9 c9 n' o5 S4 o: V; u/ l) S3 |- {
赞 1 收藏 评论1 发布时间:2023-10-15 19:34

举报

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

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

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版