概述
, u3 n+ t2 X- D本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
; p6 l/ `" n/ ^* b: O5 u' e& I/ ]/ K
: T# o' e/ ^7 z- A. z* @8 i) {6 |
$ f& W u! v+ N2 H+ b* h n
. S1 F9 @, I& h" @( ], @- U硬件准备
; }8 m3 k% D4 U6 T6 f# I首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:/ q" r* W9 n, i" t' W5 \
( K$ l) n7 h& u3 ^. M# ^
, Z7 q2 D) `: i- W& r5 @
/ O/ q; r6 ?% P& z& g, R9 o9 M# r1 T5 _" B7 h6 C
选择芯片型号
# N" @. ~- @8 }/ A% I( V3 S, L4 l
7 W, G- c7 o, h& K
3 @3 D* T0 A6 ^1 r4 t
& {5 I: m* Y6 V: A" c配置时钟源* {* k; q6 E' d7 V( Y, H
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
/ @; q7 z6 A! k7 U2 F, E( U# _+ h: N) P) u: A1 l
; E% L/ l o+ u; ~5 a& @
: m) t2 j, e; S; w, K9 s: ]1 q配置时钟树
! _& s* K' c. @
C, k4 j' x( w3 `; x
1 P' m, B' T6 ~1 L! {
' m9 l! i8 N1 e9 p查看开启STM32_WPAN条件
3 B9 {9 W4 S) W4 \6 o6 [7 o可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。7 N" o6 z- T0 N* ]# `
3 |! _1 G+ s E* }
( b1 j! U5 H* o) S/ ^. k( |& `+ s5 ^: t( V8 q" w0 u: }
配置HSEM
* k# ~, w4 m0 j, A5 t# _7 e/ k硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。, J- }: P! Y0 M6 s( t" V
: U5 x8 ]7 i0 O+ c8 h4 l4 C/ V: _
" o% \ G% O: L- s5 H! E% I
5 ?% C% A- ]; ] }8 e
4 Y4 v" C9 R7 Y% |0 R* B L开启HSEM如下。
! f) k$ v( \* ]% N6 y+ ?/ g) {+ g
; [' u4 b3 b$ ?7 l
# U% v+ Q( v& i" ~+ ^( T: a' }. f7 d
配置IPCC4 p! P& `. j0 r3 Y- F% v
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
3 J: \+ c5 R* R* O7 D1 @8 R$ V5 k. n, R
- E" |. v2 U; \3 u3 k+ Y- ^
; y2 q" D7 }8 @1 s& l" B: i- F9 w$ D/ T. ~! N; y& o6 b3 y9 A5 Q
开启如下所示。: d' F" ^+ K3 n& O# H& Q
) Y3 V9 |1 ?' [0 l! G
4 v! d) b+ k; z( b5 E/ i& F2 r5 ?8 D# Q# ~ s: b: } ]) c
配置RTC( u% y. B9 e9 B! r3 ~
8 T9 r& [; m' H8 y' C d
0 e# ]2 p& J( b, s. C
9 J- h8 N4 @ u1 K8 V- f4 q' j启动RF
9 h; Q9 ^4 h, s9 o
1 p0 U, O# \& P2 N/ `' ~
1 Y S0 \+ h$ ^, m+ d$ i2 E6 @* z3 V% \3 H ^ B
配置USART
! d3 n4 v8 m% [5 q7 p& I9 S+ ]( T我们需要串口来打印数据,以方便我们查看信息。8 r) X5 \+ j9 f* X1 J: E. ?' O
查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
, G1 r' j7 t* h4 _" {+ ]$ y
" k" M# y( z3 A6 k& L
" O |& _% I1 _* Y: N
9 ^9 R, Z; P& l3 c, w, C9 n' G: m- g( u& V [" `, W9 L
开启DMA。' I5 @ @# h3 F! P S Z
# f. D8 }' W- W: P/ R) Z# i M4 X
; G i- m1 x$ n, O! A& U. W3 P+ n% M' r1 _
开启中断。
7 R! ?% E' T M j1 h7 H; x# z4 S. x7 Z' L. o; j; x4 Q
# z0 J; U& o% p4 X, s
H: q9 V9 @4 e7 l- @& F; {" a开启STM32_WPAN+ T( t8 f `- T9 p
无线个人区域网(wireless personal area network)。
6 e. T- Y% O. e2 S4 Q: T/ P由于我们使用的是蓝牙,故勾选BLE。2 X f2 z- g, s& T1 J5 E5 e
* N3 V: C1 J9 M
# C; b4 q6 B: l, c
% ~& K. @, k5 _' T9 q( t c O配置自定义模板。
3 d* b$ f6 F, L1 J" K% t2 p
3 j6 S. S: @ y+ h) a# P! @
: p* d3 f: X3 t( L) z' Z1 O
/ ~1 o; U0 @; U设置串口1跟踪。2 \( f1 p- Z9 B! V* X5 q0 I
- a. K2 j3 {' i+ i2 q% s
! U9 p" s6 ~7 V5 W
& B8 k1 a; @+ m2 ~# \: t
关闭MX_USART1_UART_Init函数的生成。
+ ~* b s7 l; P% U
7 m, w c) ~/ R, e+ ~
9 D. O$ i, V! f* m2 t1 v/ q% K1 I
! T* j/ k/ f! L( H0 }7 H3 v启用串口1的tx的DMA。
) j7 U |6 l$ A- r4 Z& r& \5 F* R, n1 g
6 b7 y2 S* g5 ` r
- ~& l* o8 T2 ~' }( a, j6 V启动串口1调试跟踪。
6 h8 x' o! Z- p) G* Z/ _' T( }' H$ D. a
! s7 j& [3 ]; d# S s+ l8 _8 M2 u
" v+ u l5 g5 w% W% _启用应用程序中的跟踪 。, J! C1 ~+ O; o, E2 S
& D' W( l7 M, W" Q( E7 z/ ~2 L
# J) v2 X; l9 E; M: L/ S
8 t6 P! }! M3 J4 z设置蓝牙名称,名称为MY_BLE_DEV。
/ J- `7 Y/ r" z* f5 q9 N2 N
' D: a: n7 E* E/ c; |) V
% i9 F7 O3 B2 j: Q8 X- T
3 s- j, T( m3 \- l6 F. c设置服务器配置。& w) ~. u" B/ T- n
7 v- y6 x( W I" G) Y
! [- q# K# l& j, J5 m$ I% N( j+ Z
$ ^- L5 b) x$ l$ p0 b设置特征名称。
; c j8 h" G9 c1 q7 a8 d8 h
% x( M# R4 P3 U8 V( o
$ p+ S; w, W6 O: f. w. L+ B
- I0 O' s4 X# L# a使能特征值读取。
7 E+ P1 E9 v4 t2 i
3 P! @# ]3 `3 Y+ ?* R
" [' ]/ _/ U/ o+ R+ {, q
1 c4 L5 e$ G2 Q; o, @6 l关闭GATT事件的返回。
8 e% o5 c! v% P: K; y3 \5 t& Q0 ]3 _7 i
3 z+ w, `2 L& A
/ F; H& r2 ~% q4 Q4 Z0 \# M设置RTC和RF的时钟。
) B) Y# w& B% D! k4 J7 m2 D: J, ^5 g0 L
. l2 @$ \$ n; j8 z x
& B0 N3 I \8 c6 e* ~! r+ e设置工程信息
+ }; v! A: H8 `' k0 r. x8 w" ]/ t! w: F! N( ?
0 b( r" E/ `$ E1 I7 X
% ?( F. L8 O. b5 Y工程文件设置
! J$ O3 t/ l. e5 ]+ J$ l; ~% ? S
2 W0 `& ]8 d$ L: \$ c
" y' n X! n7 e4 dKeil工程配置. M2 r3 c" i1 s# Q# r' M
( i: p8 e, W) a, u. R" j
& D% v2 ~) [ q6 y# }' j
; g5 s: r& a, \( l4 |! [4 T代码配置" o6 g! n, e1 V2 {0 t9 q8 n
在main.c中添加如下头文件。
- S1 s# ~$ z Q0 G) G+ h7 F9 |' b& z1 f. M1 U+ `& o U. v
- /* USER CODE BEGIN Includes */
9 Z5 N7 n5 h# W) r/ @5 p; F - #include "stm32_seq.h"/ T9 ?/ ^1 q; p: I
- /* USER CODE END Includes */
复制代码
* Y1 q+ T1 _: n/ s$ P. o0 j7 ~UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。# x$ J; b/ Q. M0 f# O' l# ?* D6 ^
# s: L/ P* d( g% U2 S$ |
- /* USER CODE BEGIN WHILE */- J9 e5 c. B- @$ t+ {1 {" ?3 }
- while (1)
0 q+ A2 x- T8 V( G" Q8 _) a. i. e - {0 ?" V1 ]- `' f% q
- /* USER CODE END WHILE */4 L' s: ~# r! W- } A1 N+ h! }
- MX_APPE_Process();
7 Q0 b, e5 A2 w% X3 B - ( G1 J5 B# X, B- f4 d
- /* USER CODE BEGIN 3 */1 O* u6 u2 y# Y/ L
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
* ~3 m9 ?1 p$ c9 E# p* \, ~ - }
5 J+ Q) N6 B! I. ~ - /* USER CODE END 3 */
- N ~/ b( t1 Y/ {- f2 i+ g - }/ N7 i6 d5 a& ]# ?) y* R5 r6 ?6 T
复制代码 + Z; E3 L; z5 a* @& Z8 S
在app_entry.c中添加初始化 APPD_Init()。
6 l+ B* P# \8 D: `" H9 @' H% f% S* h6 }# f* F, ^" _
- void MX_APPE_Init( void )& n" b( c* r: V. c, Z
- {
4 p3 H1 R7 i- y4 B- Y' A - System_Init( ); /**< System initialization *// [2 e6 m, ^3 F
, ?9 M/ \; b0 q- SystemPower_Config(); /**< Configure the system Power Mode */
$ o* m2 k- Z4 j# U+ R# r - / ?( ?. P+ d. u1 \ Q7 N% U1 c# x
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */1 x) _9 J. l* v
1 a# v* P! g) l1 K. c- /* USER CODE BEGIN APPE_Init_1 */5 m6 l" Y# F* ~/ d
- APPD_Init();
7 T! j3 x& |/ m9 y4 z) W' B/ `( Z - /* USER CODE END APPE_Init_1 */1 R/ E5 k+ ^" C/ x
- appe_Tl_Init(); /* Initialize all transport layers */
9 y4 `6 K: D1 Z# g* p2 C/ @5 z - & i' L% X* V; q# C3 G5 C- f
- /**
/ G8 m$ @7 l4 K* T5 w - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
6 n @) i; ]& I$ q& Q1 Y3 G - * received on the system channel before starting the Stack0 ?9 }; c+ L0 @, U
- * This system event is received with APPE_SysUserEvtRx()3 N! Q( A6 j) a8 b3 t
- */
+ @/ m2 h( B- L4 M - /* USER CODE BEGIN APPE_Init_2 */
% X' R7 ?3 O! T" v6 D* Q - ( ]) _: G6 @7 O3 r8 X$ `0 g7 N
- /* USER CODE END APPE_Init_2 */$ a1 ^$ K b# T" d- a) |& @
- return;' ~+ {: w, B6 n. U7 i. F) S. M/ T
- }
复制代码
m4 Y7 f: X+ @6 G) Q# J结果演示6 L! a" C& R/ F6 w$ \
下载完程序后,可以看到串口打印固件版本等信息。$ |; s$ _0 J. N2 u- b
) d. g0 u( r4 o
! z) r" L0 o. j' `+ B
1 e. E; b T0 L3 a+ `
打开ST BLE ToolBox软件(APP在群内有615061293),可以看到该蓝牙已经可以搜索到。
K% ?8 c7 H9 y8 e' @3 L3 E1 y4 E
) n, G& F0 e' t" u
7 N( T* p& {5 `! D; D$ M
; f" h, J& B$ U2 T/ I9 I- s! ?点击connect进行连接。
3 u. ~2 m6 ?5 l连接之后可以看到串口打印了连接事件。! m8 ]& W& |( n7 i* f8 ], j w6 ~
9 q9 o6 S- F8 B- h
4 P( i( n! ~( Y1 P: F# Y# P
# f: P+ \# U0 t. L; z* j同时手机也显示该蓝牙模块连接成功。
C: D( F p- ?7 k5 c5 P
9 h0 f8 R+ B i+ k6 u
/ a7 j: m N( S- W7 W. f/ Q |