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

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

[复制链接]
STMCU小助手 发布时间:2023-10-15 19:34
01引言7 v, ^2 v$ d3 P( A) }
" ?" q$ D! g. m+ `5 Z9 g
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 O9 H2 {: w2 @7 D. v4 J5 Q
0 G* B) |5 |3 o) M  b! \+ t
本文的目的旨在使用STM32CubeMX以及Custom Template例程基于STM32WB55-Nucleo实现基于BLE私有协议的通用通信框架,使客户快速上手进行产品开发,且可以直接应用在产品上,应用框架的设计如下图所示。另外,本文还对BLE协议栈的下载和升级注意事项做了详细指导,如果读者不熟悉这些内容,可以先行阅读。
+ k3 @) ~: o0 H7 O
) J* ]$ a& B* F, H
微信图片_20231015193351.png # z) j& g4 v2 Z1 Q: w0 _! }- ?

/ _5 ^4 N0 m5 D' k6 V- n
如上图所示,使用手机APP与STM32WB进行BLE私有协议通信,一共设计了4种类型的数据访问:读/写、只写、只读、通知,这4种访问类型基本可以覆盖大部分数据访问场景5 x0 y" U4 R- H; k7 D+ {0 d

! g% ]1 L+ F, S: r$ j- M

, J0 m1 s; r4 D
02STM32CubeMX实现步骤, E7 ?  l: F5 d; z6 t6 S
( e. ?& ^/ s# B1 M* F
2.1 创建BLE工程添加并配置外设# k8 X& |. ^% X! p, p5 [$ P
请在搭建工程之前,下载安装最新的STM32CubeMX和STM32CubeWB
1 k1 T! z$ G" g) L
4 S4 b8 K7 X% V1 G) _9 ]
2.1.1 在STM32CubeMX中点击“File”/“New Project”在弹出对话框中输入“STM32WB55RG”创建一个新工程5 o7 d& d5 P& I" O' |! i
# l6 J3 O6 l8 x4 M9 l$ F' T; ^
微信图片_20231015193348.png ) X8 A& v% |3 \: i

( H' p3 l6 V! e& x3 I3 J: u
2.1.2 工程配置如下图所示,配置工程名字、保存路径、选择编译工具、调整堆栈大小和选择需要的STM32CubeWB的库文件(缺省为已安装的最新版本)。) w$ |/ q' j; s8 ^0 H

' J7 i9 w% S# T' E
微信图片_20231015193343.png
- z$ v# E, U' Q; L! M

% v% s5 Z; S  C/ V
2.1.3 系统配置:调试口

7 c1 U8 {3 A! i0 q$ ]1 g
- o2 p& n6 o/ I4 R9 h& t" K4 W# v) f
微信图片_20231015193339.png
( F8 a2 b$ Z6 L8 d8 M

  b- _0 @7 L- |
2.1.4 外设配置:添加外部高速晶振(HSE)和低速晶振(LSE)
, T9 J* P) a9 p+ p7 e! E& O; z
& o! n* [. N+ g4 B& I5 `& \
微信图片_20231015193336.png
* t0 F4 o% Y* D1 m
4 i  I1 j! F8 v& `& b2 V
6 I% u/ t! k6 Z4 n. h% h/ n9 O2.1.5 外设配置:调试打印串口USART,手动将USART1引脚重映射到PB6/PB7
" G) Q! V- u' a5 b: `7 _) I

* u, h1 v+ i5 G. W3 e/ P
微信图片_20231015193332.png 4 ~  ]3 P7 I) }& S0 \
使能USART1的TX的DMA功能和USART1的全局中断/ V. I$ m3 j  G2 `
/ K/ r6 ^( O2 L9 ]* S
微信图片_20231015193329.png ' b1 Q5 B  e. H- y

  P1 |) I! x8 b& {$ Z' c0 B
2.1.6 外设配置:使能HESM,它完全由BLE stack管理
6 S) t7 _0 E6 Q6 Y5 T; }( ?

5 A4 q$ o! d3 ?$ H
微信图片_20231015193326.png ; p- V7 c' n6 R0 f& t& N' F9 Z

$ n* m& B+ d* o5 C: }2 T7 t- [' y

$ u; K+ L$ a* |+ i" i6 Y0 B) z
2.1.7 外设配置:使能RF,它完全由BLE stack管理。
/ J6 g% C( T$ R: x9 Q6 A
1 @. G; t$ O- V7 N3 o, D; N0 v: u
微信图片_20231015193320.png
1 |3 w2 n4 d; R$ h9 Y
# q) D1 S, J3 `( D9 P$ `
2.1.8 外设配置:使能IPCC,它完全由BLE stack管理。只需同时使能它的RX/TX中断即可。3 _% c( ~2 n4 M( A* }

( m9 [* ^, X2 @: s9 m
微信图片_20231015193316.png 9 u) J7 T9 i) g7 Z8 u- D; a
/ Q$ D6 e1 e5 ~$ }8 S6 b. ~1 g, m( m
2.1.9 外设配置:使能RTC,同时选择WakeUp为“Internal WakeUp”和WakeUp中断。
# E$ ~6 U# e6 g# w
* {8 A  y0 ?7 y
微信图片_20231015193313.png
( [) [- |  O5 l* E7 B" {
) O: W2 P  j. |! A% {- H3 p6 P
2.1.10 外设配置:配置时钟6 h2 ?/ L, o" s- d
& o  ^) p& ^) g
微信图片_20231015193308.png % a+ c( r8 c5 k2 I) \" z

- _' I# w, N5 c2 j7 c" _
2.1.11 外设配置:NVIC的配置5 e2 k: \+ `6 H- R6 A" Z/ Y

- Z5 Q) d; Y2 |+ C* C
微信图片_20231015193305.png ! K: l( T% V+ A; C: ]8 m" X
6 J- O- I+ v9 v3 J
至此,外设的配置和添加部分已经完成。
8 F. s& {$ G2 T( L
9 J: F3 @: p- ]
+ p+ c6 O$ P8 C
2.2 BLE协议栈的添加及配置  \: p" h( H, G: \7 }; _0 `
2.2.1 协议栈配置:使能BLE协议栈2 \6 e' J) ?* j$ a( N

, \7 X+ M% |" ]" J8 i* O
微信图片_20231015193301.png
; D  L6 B0 h) @3 W; H7 [

" ?0 u) F% M0 x" ^6 r3 o" P3 s
2.2.2 协议栈配置:禁止“Custom P2P Server”并使能“Custom Template”自定义GATT通用模板# y. d1 F1 M3 _' \4 k

* P- F' n! S8 z+ V
微信图片_20231015193258.png   f& f" L/ W$ a; e* r
2.2.3 协议栈配置:新建一个GATT服务,其名称为“My_Data_Server"  R; _. l9 P* l  s9 L) z

  h+ t- @5 X# @
微信图片_20231015193255.png & V& o8 h1 Z' t6 Y4 N

+ T- U% k4 j, C
2.2.4 协议栈配置:GATT服务基本配置
+ `$ G/ \# j6 I) l: M/ Z2 u, U& a- d0 h0 `. `6 F) U  [
微信图片_20231015193251.png ' s0 q  a+ E+ [

+ E. Q/ s0 t) F9 B5 B$ d  r) n4 U
2.2.5 协议栈配置:配置GATT读&写 服务特征及属性值
" E3 D) H, T+ [( f" E3 j

  H* ^" d* R1 ~5 l/ Z+ L# f
微信图片_20231015193247.png
5 s* E% z) x: I  ~& B! f/ C+ q7 F
$ z. i* Z5 P+ c) x' @# \9 X
2.2.6 协议栈配置:配置GATT写 服务特征及属性值
. i" i# S& `6 H. |6 J' C( [' J2 P" U) A; r+ h
微信图片_20231015193244.png
: j9 Q3 B! w8 C4 ]! R# T! _" G1 l8 F2 P9 p
2.2.7 协议栈配置:配置GATT读 服务特征及属性值
+ b3 U7 e5 b, |, e5 {2 a3 `. Y" d  ~# ~; j  w
微信图片_20231015193240.png
8 l; L( _( u4 |* A' W6 Z5 N
- O( A: z5 O# U8 x2.2.8 协议栈配置:配置GATT通知 服务特征及属性值' ?' `: D/ Y/ v. S5 T* O; p
8 j; Q5 B& x$ G' V" \3 Q& e
微信图片_20231015193238.png
. F9 @" g" ~( u+ j6 ^
* z9 D. I. O4 M3 m  T
2.2.9 协议栈配置:配置GATT广播参数配置0 x6 a8 A, \' ^& k( O

& u  T& u7 I% @% N
微信图片_20231015193234.png 0 f; F! t" q4 f- n% G4 ^

3 l0 k  T7 I+ F4 e$ s0 e* A
2.2.10 协议栈配置:BLE配对参数设置
! K. E/ \5 ^1 c+ h$ h9 @6 p5 b
5 h, ^" {- k+ {  K  O" l' U6 d
微信图片_20231015193232.png 5 G1 \5 j5 A* I7 D9 E8 e
  a4 e9 p4 ~9 M( i$ A
2.2.11 协议栈配置:BLE协议栈调试及打印配置(需依次序配置)' W5 Z3 v3 R- \
$ ]& B0 @* U" N) k+ F  g
微信图片_20231015193229.png
. w, O! a, _- L3 y5 Q/ N( e

0 r4 A8 }  y, b" ~
2.3 生成工程代码并初步测试+ V9 B2 m" \  t6 ^  a+ o% v' ?1 x
2.3.1 点击“GENERATE CODE”生成工程代码4 ?, g2 ?( r3 V  C

0 \, n. b# E8 G
微信图片_20231015193225.png
( W5 W" D, d( F  ^. V/ {' Q, N9 D

5 n1 b' K8 V, |& Z* U; ]" a% Q
2.3.2 在生成的代码中添加BLE Trace&Debug初始化代码
% p. ]8 {/ l1 G1 D: y( S

3 y! s4 v+ D- L6 t0 X, @2 P
2.3.3 在“main.c”文件中取消“MX_UART_Init(void)”的“static”属性
8 i  B5 e2 X. N1 A

# E4 [5 a' J3 r0 [" p7 h+ t* K
2.3.4 在“app_entry.c”文件中增加“Debug”模块的初始化代码“APPD_Init()”。4 T8 J; D) I  X, Z- f
/ h, q7 `' c8 V# v4 t
微信图片_20231015193223.png   V5 {) h) N4 P* T3 m+ h
/ Z, j/ }$ P* D0 F+ U$ |
2.3.5 下载代码到STM32WB55-NUCLEO中运行。此时,在手机的蓝牙列表中,已经能成功地搜索添加的BLE设备。说明Debug和BLE协议栈已经成功运行。) W  E6 ~" S1 ?; R7 |$ |

, K/ v% p5 E/ {; J: j( w
微信图片_20231015193220.png 8 g; ]9 o' P9 l' W% p

2 [/ C2 I6 H" m: c6 d- `
2.4 添加BLE Stack应用代码
& j, y7 D8 d2 C5 U, S9 s
为了便于对后续添加代码的理解,我们先将Central(手机)与STM32WB进行BLE通信的数据交互概括如下。所以需要将用户代码添加到Custom_STM_Event_Handler()、Custom_STM_App_Notification()中。: l1 [3 D; C! g( S

( z8 V! {6 |; f
微信图片_20231015193217.png 4 w- e- l* L9 Z

  a  \% l% L5 x/ U/ E
BLE应用代码添加:定义用户数据缓存。& b9 m, O, l; a3 Z# ]
在“custom_app.c”文件中定义4个用户缓存区数组。
. Z8 F4 Z" Y) C; O$ F2 M
+ v1 z4 N$ i# V% s
微信图片_20231015193214.png
5 b, ?' n1 S1 f+ B) N% `
% v/ L5 p2 v( o6 F. J
BLE事件驱动代码添加:
) j$ Z: V) [, N, Q
在“custom_stm.c”文件中的“Custom_STM_Event_Handle r(void*Event)”中依次为WRITE_READ_DATA_BUF、WRITE_DATA_BUF、NOTIFY_DATA_BUF特征和属性添加stack层的事件驱动代码,以使BLE数据从stack层传递到app层。
: l" E$ ]% j! G) V) }/ K; V

$ s; {9 Z: @4 D( u- f  K
添加特征1 Events:WRITE_READ_DATA_BUF(即User_Write_Read_Data[]对应的写&读操作句柄)请求驱动代码。
* x4 K" m+ H9 b" i& K. P
  X+ t, \5 n2 \) B  m0 z/ M0 {- j
微信图片_20231015193211.png   K& z" O- h, R9 }, n& A. \
3 D% L9 R+ g+ A+ b
上图对应的代码文本如下所示:
& A* p* @8 D, C3 Z% u" f

) p( ^2 \1 f4 g
微信图片_20231015193208.png # p; l3 `2 X9 h$ A7 n( [0 e

# P* q; @1 _8 g( j 微信图片_20231015193205.png
) @1 B* `8 B# z2 D6 [
$ s2 s: F$ v" Q$ v. l& V4 ^3 q+ o; m  h
上图对应的代码文本如下图所示:
3 n. A! ^2 Q* c& d" b+ D. P! Y! {

7 t) V4 W# s' `/ g
微信图片_20231015193202.png 5 r, Z0 |( h8 I) y, }- G$ \; d( X

$ g- F: e$ |3 s
添加特征2 Events驱动:WRITE_DATA_BUF(即User_Write_Data []对应的写操作句柄)代码。
3 _# D/ `+ P; o

9 a& Q$ {; }, K  N: Z
微信图片_20231015193159.png
% k$ V( Q0 i9 d; s

/ O& E7 x- p" U) K( U1 m, P! W
上图对应的代码文本如下图所示:
6 C0 T! z- u- D: m: `

8 A. A) [- Z" ^/ [
微信图片_20231015193157.png
2 R! P* l# ^% \# x1 W

6 G% n5 M  |( ~
添加特征3 Events驱动:READ_DATA_BUF(即User_Read_Data[]对应的写操作句柄)代码
& X2 t, l, P2 \8 J

: e7 K4 p9 G5 u/ v3 V3 ^
微信图片_20231015193154.png
, d- `' m! V, [  e! m* }
) [8 L( F6 y3 o0 L
上图对应的代码文本如下图所示:
# ^, }: J; }6 e: @$ P8 U0 x: E
: N0 m- X. @' {& X7 |8 d. R
微信图片_20231015193151.png & E9 `4 y* \$ w1 b2 A3 @7 r( U7 W

- V$ @' w/ [6 G+ Z1 e6 \) G
添加特征4 Events驱动:NOTIFY_DATA_BUF(即User_Notify_Data[]对应的写操作句柄)请求驱动已经由STM32CubeMX自动完成了。NOTIFY_DATA_BUF不用再手动添加。9 Z$ a- h/ }3 y1 z( d6 J
1 P9 {. V9 f$ f" e4 f0 o
微信图片_20231015193147.png + ?% ]0 g6 k! V8 }
6 ^2 `# f5 R6 G/ B
BLE应用数据代码添加:
4 ]& g7 p- S+ G. J: G. ~
在“custom_app.c”文件中的Custom_STM_App_Notification(Custom_STM_App_Notification_evt_t*pNotification)”添加代码,以将BLE数据上传到4个User_xxx_Data[]缓冲区,依次添加代码如下。9 `: t: ?4 ^( [1 a2 e" N; H
/ T" r0 I+ w9 a6 Z: N7 X
微信图片_20231015193144.png 1 z8 \1 `% `6 O0 d( ~- e6 K
& C. s% ]/ E' g" x. o
2.5 修改BLE最大数据包传输长度

6 ~; F0 j* ^8 ]% s& \  G  M! y5 \
如果不修改,BLE单包长度最大仅为23字节
3 W) A! J/ l. o4 d
1. 在“app_conf.h”中修改BLE stack最大数据包长度(CFG_BLE_MAX_ATT_MTU), N* y% {* r3 X' d. m* ~

7 v, |: }, q$ G' W+ ~6 @
微信图片_20231015193141.png # z( X9 K6 C: r7 U" I# z3 m3 Z% z+ i
2 P8 c: o- t1 `+ e6 Y
2. 在“app_ble.c”文件SVCCTL_UserEvtFlowStatus_t_SVC CTL_App_Notification(void*pckt)中添加红色部分代码。
; K4 G% T) D( J5 d3 I) J2 i: B
( T# n0 b/ a- G& X" X
微信图片_20231015193138.png + t9 H" D8 f  M
0 Y) G% s2 R+ H5 \: Q9 b" D( U
至此,所有代码更改完成。
6 @- j7 B9 M: Q1 N, G. l* `% O) b8 T, S

/ u5 J9 l; q4 S6 k
03测试平台搭建及功能测试' `* Y3 a# V$ S5 ^6 t

3 t7 W9 B" h4 a7 g4 S: S" q
3.1 使用STM32CubeProgrammer BLE协议栈安装(升级)
1 o- \8 c3 q( F! O9 n7 Z

' n! S5 Z" N  {4 B* Q9 w
升级ST-LINK固件以保证与STM32CubeProgrammer驱动是匹配的9 g1 H8 W  v& C0 l# H( u9 G) w

- s4 {( G) h! f+ e' {
微信图片_20231015193134.png 8 c1 m2 N1 t* }0 n

5 N; F, \6 ?( @9 p) `) k
查看当前FUS版本,并将FUS升级到最新版本, l" q  {8 R9 K0 K- j& o+ _

5 c) j8 }* a" E8 c/ ~* T
微信图片_20231015193131.png
) }' B) S0 o( G3 C; ]4 I. q4 l
. D/ l1 {1 x$ G$ H0 R) [
如果当前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”。
7 ~! l: |! `8 \4 z

5 T* v. y# ]8 `# T' |1 c5 w
微信图片_20231015193128.png & H5 w; r; q; `' r5 N2 O- c
  p0 K8 e4 D) }8 R/ B1 e
升级(安装)BLE协议栈,根据MCU型号选择相应的固件和下载地址
* Z8 ]0 ?. \: `# _

1 p# g- o8 K% @1 s1 `) R' n3 d4 T
微信图片_20231015193124.png 1 A6 Z2 [5 J. f( R0 ^4 u) ]( G" x
  J  H+ _$ ~# c$ B
3.2 测试平台搭建及验证
  s! U4 D$ ~5 @' \5 j$ t3 t
2 O6 z  N$ X% J+ x
3.2.1 在Android安卓应用市场下载安装“BLE调试助手”* Z6 q( Y  g8 f; ^6 t

6 _/ y; D$ O* Q8 [
微信图片_20231015193121.png $ u8 A9 q" Z% b# s; D
7 A. \: Q1 b5 q) h
3.2.2 可发现设备“MY_STM32WB”,并点击“CONNECT”后可以发现application特征和属性访问服务,如下图所示。4 V9 d# g/ m$ x9 ?3 J! ^- w
0 q5 N4 ^' G) u6 o" \  T2 w
微信图片_20231015193118.png - i! w9 ?& R/ c6 X- L- A- i+ B; ]
, a: R2 T/ O- E! N3 ?% ~1 e
3.2.3 设置BLE最大单包传输长度为256字节,否则L2CAP层传输超过23字节将自动分包。" j+ v- T8 X: l  K& L8 [
- n  N5 x% i0 |5 q2 R
微信图片_20231015193115.png
2 d2 A" B0 L& s

& Y5 K; K0 _2 I1 o7 T; S% d: n4 {
3.2.4 手机app写数据访问(User_Write_Read_Data[64])测试, q: Z; M; C& N3 j! K

, s3 N" V% Q, v6 T+ K( p
微信图片_20231015193104.png
& h) V% j$ n% c

. p! B0 Z: B' D% h. p  v
3.2.5 手机App读数据访问(User_Write_Read_Data[64])测试8 k" ?" j, E1 E

' D+ `  k' H! V; N4 t$ U
微信图片_20231015193101.png
1 P4 `+ Y1 D( c

. L& p6 g  H2 ]' y" U5 O/ g
3.2.6 手机App写User_Write_Data[64]测试
5 q/ k0 s" R  V4 Y

4 D3 \* }+ S, m& k! d
微信图片_20231015193057.png , @8 M# d3 C: t8 ]9 l7 P

# q0 ]0 R( w1 |/ k) S! }& }
3.2.7 手机App读User_Read_Data[64]测试。
9 @9 [# m$ J% @2 Y% ^5 }! p' [
+ ]  Z/ X. K( k! i: i3 m
微信图片_20231015193054.png
8 y" I( U8 H  P) k7 m' o! ~" V5 B2 ~
+ X% m1 z0 w( _7 }4 S3 i, |3 u9 E1 w5 S
3.2.8 通知数据访问(User_Notify_Data[64])测试# j2 ?6 z# |( L% i. i6 F0 r

- I: t- O8 Q3 Z2 c
微信图片_20231015193051.png " h, y; U1 H- f% d

- B1 [7 l1 [- k8 g6 @- ~
至此,整个验证和测试过程完成。
7 b0 v) y9 s& u" Q6 U& N5 U

# c2 z; B) n1 |/ k! w6 q
0 [* S' Z- [7 t) h  k
04小结
; V* K3 \& y% W) e
BLE经过多年的发展和迭代,BLE协议本身已是一个很复杂和庞大的协议族,如果希望开发自定义Service和GATT应用时,若对底层协议不熟悉的话还是较为困难的。但是由于STM32良好的生态,特别是借助于我们的STM32CubeMX+STM32Cube_FW_ WB固件包,使得我们可以快速、高效地开发出各种BLE应用。
+ U& Q' @4 W, k) C9 a' x2 Y& F: f1 P

/ K% g1 j$ a4 H
3 L- R" h4 J; U6 S( s3 E
转载自: STM32单片机
8 z: I6 f+ j9 N1 O1 n2 |+ `- z5 t
# F# b5 {3 ^, S0 a. i( M/ s" f9 m
收藏 评论0 发布时间:2023-10-15 19:34

举报

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