概述
* J6 x) F2 }3 T5 K0 o: H) a本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
# Y9 Z3 R6 r/ S: Q* N8 @7 L$ `3 b9 B F5 U$ g6 b) j: X6 S. q& e& ?
/ C' l8 H: X( `( }; l8 I
6 N, d7 p d& [) L/ _3 X硬件准备
! X1 i$ P$ f! e- D- [首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
8 R1 X5 x' V9 `8 }# z2 y6 n8 @2 V9 Y
' I# f: G) c# S+ H
e" f! M1 Q/ p' d: v/ J" [& |; Y/ X1 c; R3 K9 m2 C- L" v
选择芯片型号6 Y. _+ X5 g6 I7 q0 ?* v
% F6 D7 G# b7 x2 f$ u
: H! ~& R" b. Z* l9 l8 ]9 \
% h G7 h7 ?3 B! F4 h3 Y. q" X/ O x
配置时钟源. ^2 m6 _2 ]. D6 ~% W, f/ j" c6 |
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:9 Z0 q( W+ _4 T+ S3 I/ d! G
( Z* S% v" k. e' J3 x0 T) N
& {$ Y1 T6 ? ?8 J/ R1 `" b7 T9 a( r$ H5 @- h0 r
配置时钟树1 j) u% N" E6 m, r( n
6 S w$ A0 m) ?8 ^/ ^* Q6 U9 A) c
- {$ f7 x1 \) Y
7 p: H& [- P- k" I1 H' Q
查看开启STM32_WPAN条件! L0 |7 B7 j: Z; Q, H
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
) ^5 Q1 H. e }1 q# P0 m; Y a9 j$ |
! ^7 q! J$ R) m( _1 f: R, D
8 r: q4 E& F# _" Y
1 c9 E' C- x3 u# j0 z配置HSEM0 b2 W" E- I' i; A9 x- U |
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
9 v' C# p7 A# ~, h: M
) [ r4 ?( X6 O8 y" @
, I' P/ W9 T! Q: r! |/ B
0 A P H4 K" L3 C) }9 o. c' Q& l0 F. z
开启HSEM如下。+ j2 Y+ o! D3 A
- q5 r+ Q9 k9 d, R1 t
0 X; ?4 C$ y7 i( V# I& x6 U9 v
/ E6 d( H E! ~9 v( S T配置IPCC4 p) _! C! l; q) A
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
' i2 F1 c- c3 B) O
7 `: C V. U4 }1 F9 e& U8 \
, X9 [2 u( [/ ~$ Q( w
6 C/ }! ?5 p9 G m5 S! T9 p9 W$ E8 W" o' ]
开启如下所示。
- ^" |( v: t. s: W/ v9 {4 Y4 R# }$ a) |! ]* C
9 C& V( P3 ^* K: Q( O
9 C$ Y8 Z k8 {4 A' T* W
配置RTC
% P: c' C( m3 X6 a# K2 H
' s: V, ~6 P! y4 H, \1 d; Q
* ?, Y* }5 p' d* l* ]
" O$ q; V J6 M6 c! q e7 _% D5 t. n
启动RF
: P% g! V/ {5 ` a. o% f- V
* _" E8 I+ M; h! ], V( j6 G/ o
4 e# U' u( e) q# e
5 W, _' ?. R5 L \
配置USART* z6 R1 C3 h# }( F6 @1 J$ Q
我们需要串口来打印数据,以方便我们查看信息。0 A% c1 g+ f" n7 o X# {# E$ [
查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。* B s8 t: s4 z* n& E* f
5 e0 n$ o* r" J, e, \ G8 f% \+ A
2 q# H- w- F, a5 k& P
( R. T, ?& J. N* N: K/ X
6 e4 O: G" F# W开启DMA。3 [8 _# e; J* G, ]3 O% ?$ l
! V9 P0 A, X* T- q3 S6 m' l
6 J& o. Y& q# Z/ z+ `" X5 E
, V# v# z; s* g
开启中断。( I# I9 T& A% I$ c
% j1 @/ v4 L) \
: E x. b4 m. k1 A0 V# K* R1 D; C! @2 R4 V: V% q3 ?
开启STM32_WPAN8 A: y( s2 V6 O& @5 p
无线个人区域网(wireless personal area network)。' H+ V ^ Z1 h( h2 d
由于我们使用的是蓝牙,故勾选BLE。
8 A% Z" S+ G: X3 `" z2 K+ @
$ A" i0 A; z0 W4 e
$ G N) Q i; j
- x5 Y+ f" ^8 O2 n配置自定义模板。3 r4 p% z7 q: A |9 V
2 P4 p9 c8 d W) t
4 F! U9 G6 i9 q, ]/ o
% w" C* l; D% G
设置串口1跟踪。) L. H, ?6 I" G( _
; s' f7 m7 k7 v
$ M& I I/ J/ |( }8 r2 f: \1 y2 ^- P+ u
关闭MX_USART1_UART_Init函数的生成。" u* I; w2 c. ^. D* K4 S4 m7 U
0 U6 Z; ~# @" D. `# K; w
0 f: {2 n5 Q, ^* t% k8 b' o5 [
; b& z, ]: l, C; E7 h+ l
启用串口1的tx的DMA。# x9 `8 [: @7 i7 ?0 e3 v
% |" D9 y* B! \6 J5 m; y0 j
4 B. a/ G8 `6 F, C" v/ H2 F( d$ d3 n' n. T2 H0 ^1 I4 o u3 a
启动串口1调试跟踪。) U) d# q# m V5 Y2 ^8 l
3 T* y# _& g5 k, x* |( _
' g Z- Y4 `% j9 j- g/ |) R- H: E0 i n- m L" v
启用应用程序中的跟踪 。1 w* {" l, F: d1 g: x1 f! @
0 Z" b$ a- N9 d1 _( y
2 P3 O/ U, N6 R |% a! y$ l
6 r4 t" H! S7 }+ D* o, O$ l9 N
设置蓝牙名称,名称为MY_BLE_DEV。6 {. u" a) R+ Z1 T
6 k" q' P! k9 d5 U! z# W
7 ?& C& S% [2 {$ E, P$ e$ v1 U$ [; O, x8 \
设置服务器配置。+ m& T4 J1 x% A. t- t; E
( {' Q4 j! s( o b' @) N
! y4 D1 V0 r7 o7 f& n5 g$ K8 a( c. L
" \3 I7 Y/ ], D; ?4 A1 e5 s
设置特征名称。' M! g2 X+ m8 o/ G4 V' \8 K
1 J: F, M( T0 B# Q! F- g0 n/ p
7 @% f# V5 }9 t2 i f
- H/ J8 ~) d" [$ V使能特征值读取。9 X8 [; @# V4 X' R
0 A0 f* ^, O) Q( G2 h
! A$ `( U$ j, m. ^" P3 B
o8 i R3 @ V! ]' f! m, L0 i1 ^. [关闭GATT事件的返回。
8 G. b+ u9 X# ?* E( {* Z; i% Y" S- x: P; R9 \, Q" H# E1 M2 ^" L* G
6 { M* k8 B+ Q5 O6 l
: o, X. t4 |5 s' ?
设置RTC和RF的时钟。
: X* n6 x9 L6 ?( k5 u9 m
( o! o8 i* I5 V0 j
! ]- y: I5 r6 _- m% _
i: T3 b& T+ D5 r( x0 R! C8 G3 Z设置工程信息
; g Y+ L6 T% T7 Q& j' ~4 N: W1 P. k# f H$ B
7 G, `2 \4 V9 W8 v8 F, T {* M, p
' k7 e, b, R* r6 b4 A工程文件设置
( x h" r& O& x. w; W9 N% V& h
. Y( ?' E7 e% f& w
6 M& J, Q. ]1 b8 b5 h7 I
1 n) \0 d6 o$ R8 d: F; ^# [) P5 e
Keil工程配置% H3 s A2 G* V3 W1 ]
, L2 ?+ O L8 y% C3 C, o
; b1 Z4 K( ~3 `9 W5 m( s
7 f6 {9 \& F4 b) S* y0 k代码配置6 ]% a% n/ a. y: i
在main.c中添加如下头文件。
3 m# r% P# L0 f# K8 z/ B$ Q v2 c" G" V" S: u1 m: g
- /* USER CODE BEGIN Includes */* V6 G- ]; Y. B+ h9 N7 e8 h
- #include "stm32_seq.h"
4 V* W/ |, E; J* W, W1 W - /* USER CODE END Includes */
复制代码
, o A* e5 u0 x; Q1 OUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。+ H" {4 R# F% n O
4 j& y' T5 Y" y W4 E# n: ]
- /* USER CODE BEGIN WHILE */$ T8 a2 C& v s2 d7 T
- while (1)
3 ?! K) s0 c# d" g - {
3 M( W) b! t, g - /* USER CODE END WHILE */. p, l7 A2 _2 ]$ f
- MX_APPE_Process();
. Z/ H. ]1 X4 X1 v' W
& Z) q! z4 t6 Q; y7 [, c- /* USER CODE BEGIN 3 */' d! t! t1 ?% A
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
5 t, B0 s" N2 H$ ^- T - }9 z) @" [ M/ q7 A# W
- /* USER CODE END 3 */
3 u4 D5 ~* x* K5 k9 b) M' X - }
/ f+ R, {: J1 z8 g3 x# v6 m: C8 b
复制代码
! \$ O, Z5 M: J) C" k% @2 S3 }在app_entry.c中添加初始化 APPD_Init()。3 G# L2 c) ^& N
$ d+ \: A( K0 ?2 T: ?- void MX_APPE_Init( void )! S. c! m) D- @6 @
- {8 Q% _2 H9 L0 |3 y
- System_Init( ); /**< System initialization */5 ^) q* Q7 ~7 v
- ! t f4 _: S6 m- [! V3 r n
- SystemPower_Config(); /**< Configure the system Power Mode */
' T L" ~! T3 B- k0 n" Q: W0 g
2 z$ d) K7 P3 x0 i: a- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
! d! n$ }2 V8 w2 C+ c1 J - & R7 b: m5 {! k2 v( |" A% a
- /* USER CODE BEGIN APPE_Init_1 */
! D; w8 p# c0 Z - APPD_Init();
# @7 [* c; e$ F7 L - /* USER CODE END APPE_Init_1 */
5 G8 Q0 q3 g" R+ t - appe_Tl_Init(); /* Initialize all transport layers */4 e5 \8 c2 T1 ^3 M( s- g1 p
! A8 Z$ v; R Q) A: g8 a5 d- /**( ~& Q0 F, i l' M& }6 }5 \. O9 o, `- e
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )& [9 ~% b; z. ~, i4 P" M% f
- * received on the system channel before starting the Stack% f) y2 E: ]+ B; U, ^6 x
- * This system event is received with APPE_SysUserEvtRx()
( o( Y- Y6 C6 w5 x3 K3 F7 C - */* Y7 y- r, |5 u: h' }7 P
- /* USER CODE BEGIN APPE_Init_2 */# c4 z# Q. }6 f
3 O9 d4 h. t1 A2 b0 Y9 U& A- /* USER CODE END APPE_Init_2 */6 t7 H" W5 @- m! e7 ?
- return;$ L4 w8 J# f/ a2 c& Z. D6 @
- }
复制代码 6 T$ D: [& G* X0 Z
结果演示0 {5 [# L) q/ D( f
下载完程序后,可以看到串口打印固件版本等信息。
6 d/ ~1 |9 B* f- E% E% I( w z
) b _& U0 t1 g9 L- N4 ~+ @
& }8 N/ E: Z# B& Q% \ A S/ h3 Y+ }6 Q) c( s
打开ST BLE ToolBox软件(APP在群内有615061293),可以看到该蓝牙已经可以搜索到。
2 M4 K1 @; |# Z7 I
6 Q! z |* q* _
: I0 s; b6 R& F7 @/ b4 n/ J
: |, }" L5 X! D
点击connect进行连接。
0 b; N( y X6 c连接之后可以看到串口打印了连接事件。) Y/ \. M* i" T4 x- H* N& D
, g- q- z8 @ M2 y* I
6 n* N! d" E$ P- L% Z' F4 v% @6 a
! H5 A. C: V9 _1 I3 Q. l2 Q同时手机也显示该蓝牙模块连接成功。+ w8 A) z! _$ C0 t: w k7 p$ h: P) X
# R% m- Z( C$ h- ^7 C8 F
7 w9 I6 M3 l; t! O2 O7 p% O9 ] |