概述/ x U+ [# u, x; Q1 W5 i) X
本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
5 G2 M- `" A5 i: M
( \( x5 n3 Y) c4 `$ Q K
. z! l. |, ]% \ d
( A7 m2 o9 ^3 }硬件准备" w+ ~' a& c0 q! R9 ?. g, ^& D9 x' @
首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
+ l6 d9 t7 g& K; a7 X3 j( d
G; t2 f8 c0 v2 ]
7 K: x, ^; |' K9 `1 b
/ [2 e' O3 F1 P) a! ]" y7 @
) F) B& ^: z6 J7 ]+ F5 U1 z3 r选择芯片型号
) u3 _6 l% \1 i9 x, I1 z8 B4 F% t- o6 M
3 J4 Z1 e X4 x. {. C& i2 q& m# C; ? ^+ |7 w7 ?# r
配置时钟源0 n1 K0 z: j5 f
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:9 c, l3 }9 O; V6 j& V
% [: S, a I) ^7 b
8 B& s+ ~# j# y1 J5 D* @1 r
# E9 A: Z# i/ t3 g% Q3 N
配置时钟树
6 T! X7 S/ q# g4 ?* H& V( I
! ?. a" e4 D/ z" p Z/ l
4 i, J5 i m% R- h) ]
6 \9 w7 ~* N T. |. H/ S v查看开启STM32_WPAN条件
, _+ {9 i6 R& ^( ~1 ]# k可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。# _+ |3 y$ E( a# p4 f* n3 Q. t: r4 m% |
8 [1 ]$ T7 e N0 _
5 R* m4 v4 |2 k+ N' l+ G0 {! g* o
& W' g, r1 z F配置HSEM0 w& c2 V2 [# H) V2 z
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
/ `" N$ O, Y1 l2 B P
" g( h* N+ `( k
* B( u( R' k0 P$ n+ `, N
6 |6 [- z+ r+ U. i1 Z' f$ i
5 ]; m o( a8 E4 N7 F& {6 `
( m) k$ C9 N! l* E配置IPCC5 ~7 s9 Q! Q7 {3 c) U, B [
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。2 `( o( H3 k* K
3 A' H! R" G: P. G4 ~3 k7 A
3 E$ F: J; K8 V; V- R4 ]8 K+ C2 F
: \, E7 ~ Z' G& J1 [
. `' F! a+ s1 ^+ Z) r开启如下所示。3 y+ t f" A5 Y8 h
( u& b' V8 z$ q- b; ?+ j% w8 v
; e6 h% c$ b4 C' P) @
" J0 [; p0 @8 w+ i/ f配置RTC
- d3 c$ j9 Z, m' x# J# b0 Z/ C2 V1 \) m+ r" \
' \1 W( h& W. |: t6 x* n
$ z" W) {5 a8 f5 l9 K; y) Z( J$ s启动RF) E m) ]( n9 M* H8 b& \
d9 @0 ^3 @$ f' R; y X& M
1 M0 `* h' F4 P( ?/ N! o7 g+ d. }# y8 H
配置USART
2 k. q& M" M/ J5 Q! {3 l我们需要串口来打印数据,以方便我们查看信息。
3 @6 D: [: @3 V查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。4 a! q& H$ E& o/ s" P& j
; `# D4 G* s6 }6 h( S& \7 w8 L
0 x3 T# h+ A# W0 a
- u! @6 A9 c. a: }5 Q" f- n
" ~" Q) o& I5 B; L( C* S$ q开启DMA。
+ U. l: U7 D$ |- H9 U( z, L0 L) X) S" x- x: x; k! _
! }9 o7 b8 P: X# d6 ?7 X" n2 q
/ S, h a& R& M: y _0 l开启中断。
: o) E; |7 U' H7 x+ ~
( |0 G( ^: F* V- W, }( Z
: R+ i+ h' E( m
* V7 t( M2 _6 J4 y2 m; y2 m开启STM32_WPAN
6 |' H; O4 K( e" t" x' `无线个人区域网(wireless personal area network)。8 l0 D" h! Y0 e# V* P1 n) ]
由于我们使用的是蓝牙,故勾选BLE。& A0 H; u9 ]4 `( r
5 n! C( p6 n+ L; V
' X7 ~1 S2 A* K" o/ h: w
. ?' P1 d- C, {2 n$ [1 G. r
配置自定义模板。
' s z: t( M8 \0 I/ E' n+ }' d7 r3 J6 h4 z& t2 r1 n: c
: `( {- |+ Y2 B9 t3 K
, H3 D3 I5 m$ A' F4 w0 z0 w& B# o
设置串口1跟踪。* U* j' k2 V7 W( z
6 D- N9 o# x2 q' i V# z
% l& X# F, U& v8 B+ y* b( J- H% J/ h* |! [' i3 U
关闭MX_USART1_UART_Init函数的生成。
! l" y; S2 |6 X1 ?* o; |- P, s3 l A1 l6 ?/ I' b
+ r/ G8 h% N- x0 i
$ o* Y7 r+ P4 _$ G8 O! S5 T3 q
启用串口1的tx的DMA。1 e i, j8 M) B% X6 f6 O
# o% W. N6 P, L0 m; N" q
; X" d1 p: @; _- ~8 U! N7 n
5 W" g6 Q" A! _1 K) Z. e
启动串口1调试跟踪。
; z" Z/ A' \% ]" c( _( I! H W5 u2 o4 y, T/ W
! @5 ~4 O4 W/ U- g1 X' X6 z# j" g
启用应用程序中的跟踪 。
) a- F3 C8 S3 F+ g6 Y
! f% J! X# Z5 p& r
# r, r, ]" I9 E; I; W; }3 |
! ~- X. P# `8 Z k6 ^7 C7 Q设置蓝牙名称,名称为MY_BLE_DEV。
" D0 C9 u9 m1 R" D, l, ?5 } [2 F2 {( e5 e2 Z7 f
- [% u' t3 r0 l1 e4 J5 L
' W" N8 x9 p5 n0 [4 \. I2 a$ _
设置服务器配置。3 i" N% L+ ~/ m' f
( W0 u: x5 w+ G
/ T0 }0 W0 T r* q3 |2 ~+ c5 r
* r! R+ f5 X! d0 k a
设置特征名称。
3 ]% y5 R3 z) @. t7 I
9 p3 w e" \& x8 V
& H% u3 N- c8 u5 B' B) S9 @1 w* e
$ D( V9 {& Z. \- Y; g' M" \: `- T使能特征值读取。
" u. Y# Z% [7 a. U% }
^' s, K* i* K2 Y! T# \
" Y# ]5 v0 _ C1 z
8 e$ f: \* ~0 o# ~4 `( m& N
关闭GATT事件的返回。
/ D% N' ^) K& e3 V: u% \$ @5 N8 H" d- ^+ r
" E# ?; l2 Y3 ^% w2 x ?- v" |
! q. ?8 R8 i7 ~$ I# h设置RTC和RF的时钟。" M1 [- w7 e! T9 A, w
) x- K' |. N$ ]- r& z( K% l7 q
6 ~; |, A# G4 u
$ x& x: b- ]+ m设置工程信息
: M5 p5 P& g4 j3 Y7 `/ w% z- m0 {+ w% O1 P9 F$ `
1 m: A( W9 a3 s- C i
9 I9 m) x$ l: h) D( N! w6 u工程文件设置0 J- v% |! f$ E4 ]
5 E, s1 o. }/ e0 t% ?3 g
# u3 C M+ |2 Q) S- t
/ d' q" u# U0 q( ^, K2 w5 x+ s
Keil工程配置
6 k2 u2 P7 c, O' x3 y' M
& `7 C" a% Z7 J/ n0 `$ g
! s) B/ q0 _; { {/ |3 o9 l+ z1 @3 K, U) i% E' T' d9 U! r
代码配置8 }2 `5 T! A" a: W
在main.c中添加如下头文件。- /* USER CODE BEGIN Includes */: {6 \4 Q# O$ F4 N8 T: o
- #include "stm32_seq.h"
% j- i1 I6 h+ o2 D: H" j9 c) L* c - /* USER CODE END Includes */
复制代码
0 J. h7 @1 P& `7 p H. DUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
. j% s$ b+ u: b. Y3 F2 a- L% N( v
+ @ B, [+ r5 f% f! m1 T* l- /* USER CODE BEGIN WHILE */1 x0 _/ D% L2 A! K9 T
- while (1)
; ?5 ^( Y) j6 B' v - {6 K8 A0 T- F- x( A: q. W
- /* USER CODE END WHILE */
( Y$ h- n. ^6 H$ _0 w: t% e: N" H - MX_APPE_Process();5 E: i1 `# L! O5 |
- % d; N8 {* r, u- i' I/ f0 I z
- /* USER CODE BEGIN 3 */
. ~' [* Q2 R5 u+ q - UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
; C% G2 o: t1 J! d+ ` - }
+ A! P9 k" N" m* j+ N$ D7 Z - /* USER CODE END 3 */5 s/ h" X. c' ?2 S H
- }
复制代码 ' M4 D- G6 T! j. J
在app_entry.c中添加初始化 APPD_Init()。* w& x* s" ^1 }) y8 `+ U a! ]8 s$ b
/ @, [2 W* E6 k+ X4 ^( u
- void MX_APPE_Init( void ), c' e/ d6 r @% g) ]. X3 ~% \# A" X
- {
$ Q, H. m4 N' S9 y, g& o - System_Init( ); /**< System initialization */
6 s p4 Y) j( Q8 O! Y
0 S: M( B; E9 o" w5 e- n5 m- SystemPower_Config(); /**< Configure the system Power Mode */
N: M+ S9 O- n, k - 2 P! g& ~$ n5 \1 ~, e0 q0 T
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */6 D7 c; p2 A1 L) G$ [& t" E
! j; g( S' G: v- /* USER CODE BEGIN APPE_Init_1 */
' ?3 C! ?& |: A+ J* Y$ K! L - APPD_Init();2 H3 [% J- z) m0 y
- /* USER CODE END APPE_Init_1 */
8 q. G E d! Y! {$ O' Z8 K9 k: p" o - appe_Tl_Init(); /* Initialize all transport layers */
' b' g$ g7 r6 h5 F+ W - ! G3 A: R1 }. H! ^3 u* R
- /**
$ Q* E9 j( z# Y( L+ [ - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )/ _* r5 x4 ?( y3 P' i' i$ e1 u
- * received on the system channel before starting the Stack' J1 k; O# {5 U8 Y! ]9 u; k/ v4 {
- * This system event is received with APPE_SysUserEvtRx()
h6 |9 S T' k4 S5 {8 l - */
6 v) i3 q$ L. D' {- ^ - /* USER CODE BEGIN APPE_Init_2 */
+ h% q0 U& B7 v - $ @0 F% z. N8 o: v
- /* USER CODE END APPE_Init_2 */
9 n9 G% n" g# O; ~ I- g6 F8 T - return;
# n" R6 P( y3 z; R [$ M - }
复制代码 - G. Q2 N" G8 Q
结果演示9 V: E& o* a/ K0 P2 u6 u
下载完程序后,可以看到串口打印固件版本等信息。2 ^& v( {; E. x3 Q/ U! @
+ H l" J$ Z* p" p. [- ^
" R: F: c. m2 J8 `; R0 H
5 M6 a' h8 |& V
打开ST BLE ToolBox软件(APP在群内有615061293),可以看到该蓝牙已经可以搜索到。# y7 x% W. d @
! Z2 \0 W* ^4 [, {
& f. p, i$ A! g0 `% T& o/ c" B
' y- Q' _8 u. ~* m- M7 p点击connect进行连接。: R& O$ Q, B' J2 z1 \+ g. r; J: ]' V
连接之后可以看到串口打印了连接事件。
2 l0 G, I) P5 O& J4 M6 w) E9 [
& z8 i2 h# a$ V2 h. R- d4 `
7 v) ?7 C5 J, ]# z
同时手机也显示该蓝牙模块连接成功。: S g3 Z3 N% _" U. {* b
) h2 b9 V3 h* [1 N% b) H1 t
1 q( ~" ?' y- G, x" z+ ^# d
* n% x" \3 Y) y+ M+ v源码下载* R% }; R* ?* r$ Y; e
: n8 Q7 m: j6 ~' S+ ]7 T# T' @5 s1 a6 x% |
4 D7 P4 V% |% u" Z- [/ \, e6 o7 s, d( _8 B2 z
|