概述- ^5 |# v1 D( ?. D: R4 w; n
本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。* V- z Y- N: o P! _2 Q+ b) Y
3 Y7 ^6 q+ T* b: d
Z3 W0 G! }' r" N; c1 X8 H5 I+ ~6 L
* m0 G2 \0 M8 a+ u7 v硬件准备
, V" t7 j) a/ u ~/ G; S' i首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
9 |3 x; ~, a) I) ^8 F
6 G5 Y4 E- J9 u
3 R, D- w9 @9 p( o! }) a
" G$ L/ i6 b, }; J/ _
6 Q% a3 N" I5 d' q0 H, @选择芯片型号' U' Z1 |. o- [- }! j6 x! Z
) w; q# q5 F @2 _: ?2 m" w# s
* f C, P# ~2 O& D: v# j- ?5 n7 K3 n9 C8 |8 ]( G$ R3 i
配置时钟源) u9 b( g: [! Z! v4 D9 e
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
+ }: s$ j+ D! p8 ?+ j+ Q* c5 S" \* ?5 q/ K/ z7 h( _ |1 v
* n% b. y1 U; m0 i6 P8 V9 [
% D7 K+ g ?" ]; E( k5 W配置时钟树
7 q7 J& Q9 |/ n6 X, l
9 }* O( G; J* @" f/ x: g6 \
3 m/ l9 T0 u. Q
% D; p1 h, ^5 \. S7 t! [% S0 K* S* K查看开启STM32_WPAN条件
" u, @1 ]8 F I6 [* h可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
$ s' O& H( y: L5 M7 G. Y, J/ m( k9 p& s8 G# j, ^ m% ~6 j
4 H: i, e1 V0 t, {/ n( N3 c A" w
. [4 t! C: Y' m: N9 N% K) a2 K
配置HSEM
1 R1 Q d! c# P2 f+ y9 `! ?" l) f硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
4 A5 [5 `: `0 @) @' f4 A7 p# Q1 m( M4 ^. V
1 f4 B( x) N" K; l8 A3 j. i. G$ }% M) C) |
$ K# Z. R7 i, v5 R) p开启HSEM如下。# {3 \# x. \8 R0 e- q3 D
& g! t! X( A+ F( c6 t! S- G- \
' z6 E, A# z) |2 Z+ ]& p
" h3 Q( _+ }9 ~+ |- V1 V& C配置IPCC
- Z6 Z, h4 a2 _+ m通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。: F. f5 {0 g0 U8 h7 z' f' g2 o
8 e* j1 A- A6 K6 `
' e; F: u$ K& t/ @" j& V3 ?" f
" [, f" S! Q" k) ~! Y% F0 g# e1 ]4 v
开启如下所示。4 r$ U" q; `) h0 d8 v, w
Q5 C! b6 j, U% M5 c
1 h' B/ N+ A5 B) f4 Y" N
& R% P5 W n) h2 g) {9 G, `配置RTC
$ j4 D3 ]" {1 i" \9 U; {. X7 N& d0 N$ G1 \: b# L% t
% A& K: a6 O: H ?5 s3 G/ L
; @' B! o0 E5 _8 q# D$ H1 r B启动RF
1 ~5 d6 D7 o V5 K5 d% V# y$ I3 G& f0 Y: B! j9 \2 L6 N8 m
+ {0 C4 H: C& }% M7 y* f- A/ Q: P2 G+ W
配置USART1 y# t: h$ @5 c
我们需要串口来打印数据,以方便我们查看信息。
" P/ ^& p% g' X) @3 s& h9 {查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
! w- b! P; U, e& }. |$ _3 l" s0 T2 v- t3 \9 T
& H |+ o3 x$ l, q7 r4 m1 C
0 f; r3 w2 @2 K* q) X8 D1 Q
3 W( m* O8 f' t! t j6 I( i开启DMA。
& d5 C$ F/ g( @ a4 D7 V$ M: ~1 o% ]. G
7 {% K6 n- N( d) D1 w
) M1 ]/ A8 q( {1 b) a8 o0 z& @开启中断。& R3 g; r U E C% w% q
/ X9 F# I2 Z% B& T4 `& U
5 I% {) J6 w# E% L
1 f: e0 v1 U1 U7 O$ X( t开启STM32_WPAN( t& D" o3 b6 N
无线个人区域网(wireless personal area network)。
$ d+ h3 X2 A6 ?" n3 s1 k由于我们使用的是蓝牙,故勾选BLE。
9 e- K! T: G3 P& V
6 m& Y1 k& l) m4 e' f% k0 I
k3 ?' n, X6 T! z) K7 ?, b5 i# n5 B! v3 T! K1 Q1 N
配置自定义模板。- T) Y/ h1 E! `& u7 I& D
+ F; e+ c2 m& R2 B# y5 s+ J
# [6 j. n6 U/ Q+ w# g
2 F u% t$ K+ \+ j+ N3 f
设置串口1跟踪。# s7 i) _4 |' k _5 m7 x
+ Q2 @7 r# l# O6 u" h& i1 b
[7 C+ B" \4 d' t0 X7 x& y8 u
# W+ W8 }- S" i1 n
关闭MX_USART1_UART_Init函数的生成。; ?8 p1 S2 | l: T: g
& z, w' u0 A8 S$ R5 t
- i0 O. T: g I" Q
* n1 ^( a3 S. q, n8 S4 d. R启用串口1的tx的DMA。
?: c6 [/ s6 c( I) C( o
- p% p, E8 B+ T. N* k6 X
: t, Y; [( j: ^; q5 q9 Q
) ?) V; r! @) ?
启动串口1调试跟踪。- \9 o: L1 {1 \
* W0 x8 n% Q9 R0 ]" n
% r6 B: q- F9 F, e
7 }$ y2 H5 Q+ g启用应用程序中的跟踪 。3 t) W7 K! C; h. y% r0 s+ R
5 Z0 S7 W1 G% B0 {* ?
" I0 v8 { \- s! w& B/ L, K! N) {2 u! p1 V/ B9 d( S) w m5 x+ Q" H
设置蓝牙名称,名称为MY_BLE_DEV。" ]2 e- Y/ G: R# v) J% _, E4 e4 ]
& F; P1 ~( ~6 O2 r4 ~4 G( o
: j/ A: I6 Y( Z1 w( j2 [2 F# X/ ^, v6 g
设置服务器配置。
& S$ t4 H0 e. c6 j4 s
8 S0 b( |; P) f' E5 g% ^& h( e8 i# u
: l4 V3 a' v( `& p& v+ |+ k. F+ m9 H& A
# }$ Q1 R4 E) _6 e7 d# }设置特征名称。5 i5 Y: d. M9 W2 q, R9 ~
6 x c' E& |8 f7 F, f
' D4 q# j' c6 C, B- I: P+ {5 |
# l0 v1 l- y' K9 q使能特征值读取。6 [9 R9 ~- V( r' X$ m( a% E( d
" `0 X' N. W. d. S8 t7 b ]- u; ^
* @' g( M- S G$ C( O4 V# f" s/ e; a# O$ U
关闭GATT事件的返回。
$ M: I7 {% R2 H1 t/ Q5 g- C& V& \# I
2 l$ \9 ~) }; F9 W8 ?/ u: J! ]& p" n6 S: C. G; p
设置RTC和RF的时钟。
# |4 A. p" h9 r: n# t4 V- T' ^* [3 x6 \' L: v( _+ A- P
6 I# x# c ?' i9 a
, X) z( l# s9 T/ @4 K
设置工程信息3 D: L! _$ l7 j4 z
* c/ E4 K5 z& p6 T' r4 ?
7 L- a/ Z; B2 s3 a+ G' }+ u" S2 T! @- ?: P& u, W! ]9 p
工程文件设置
+ D G& W& `; p5 a! ^' q0 @' `8 I% y* u* K9 E9 j# R
, h" A4 g# p2 Z1 `4 g1 H
& }( X) A& @% P8 y" i& j0 G; W6 E
Keil工程配置! V& D1 f- U/ b- g. k
3 q5 K% b. o; Z K2 j+ i) K; Q) }
7 a2 G$ ~$ ?$ ?- }. \
4 F2 J1 a, @/ A8 m5 k- T代码配置
$ |5 H9 h$ M! |在main.c中添加如下头文件。# Q+ V6 B* f6 n* U7 w0 @
- Q3 I! @; }+ G. R& t/ h1 E- /* USER CODE BEGIN Includes */
o2 c/ _+ r! G( L! w0 @ - #include "stm32_seq.h"
% Q# z! f5 s8 v/ N - /* USER CODE END Includes */
复制代码 ]% @9 W) [% b
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。0 y# U8 D' p3 A4 S: t
9 a' k( n6 u4 `' }& b- /* USER CODE BEGIN WHILE */
9 O) Y, [, m9 O$ G, Z - while (1)2 G5 E: B) ]$ Y- I v' j$ x! W
- {
/ X7 E5 b$ m8 I4 Y/ B - /* USER CODE END WHILE */3 @9 L' i% C) O, ~, v7 T: u
- MX_APPE_Process();
$ @/ u* J4 ?. j% K3 ^3 G - 8 y+ P" p8 _; d5 o) f
- /* USER CODE BEGIN 3 */* f. Y7 g5 l: u$ |5 {! `+ Z; }
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);* f) q2 I* ~; C
- }) N- r; X3 ]2 i9 M* r
- /* USER CODE END 3 */+ ]- p- d% n( b
- }3 t- f9 t& Y* e4 n, ^- Q. Y: f1 n
复制代码 " k' j, e$ b& s5 D( l# I" w
在app_entry.c中添加初始化 APPD_Init()。
( U: ~' p* b$ c6 \; I- ?- }5 @/ v
u+ S6 {# U9 H k/ C k7 p& N) V- void MX_APPE_Init( void )8 v5 `* Z0 X7 `/ j- a3 M
- {6 s7 x- d+ O8 t$ H, D7 \
- System_Init( ); /**< System initialization */# x/ {: ~. \5 l, e5 P
- & h* Y6 A5 {0 x
- SystemPower_Config(); /**< Configure the system Power Mode */
" v( O# p# Z* D ?3 \1 N, r
! L. l1 \7 j' T2 y1 V# @3 t r5 K' W- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */& A+ Y# K$ J) \6 T
- ( l% D) U, o9 j! g8 D) f
- /* USER CODE BEGIN APPE_Init_1 */* U7 X/ ]4 S$ ~
- APPD_Init();# _: K2 P* q: S* \& R! g) \
- /* USER CODE END APPE_Init_1 */
, [% ]2 D% Q, E5 Q& Z, L - appe_Tl_Init(); /* Initialize all transport layers */) f- ~/ T$ r3 y$ c& \% U
- $ A" Y: O. F! W8 ?8 D- m
- /**, d* ]' V, S9 V" F3 h- J" n
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
3 O" _* h* e# A# l9 o6 M6 w+ N - * received on the system channel before starting the Stack& A2 e; J0 k) z( S6 @/ `7 U& ~/ y
- * This system event is received with APPE_SysUserEvtRx()
7 h( n% R' O# b - */
1 t3 c: J- k; l$ a - /* USER CODE BEGIN APPE_Init_2 */: n3 Z9 N9 I+ @4 f( q
- 7 _2 Z' \5 c5 d' P
- /* USER CODE END APPE_Init_2 */) k5 y" |7 m# m. O
- return;; \. T% q4 \+ [6 a/ ]# t
- }
复制代码 $ W7 u* f. y; h; t* J
结果演示; z5 C' F8 I/ ^3 k- E9 z3 F
下载完程序后,可以看到串口打印固件版本等信息。
% p& L E- ~; d3 z, W3 [+ M# z# K
/ z$ S* k5 J- Z# j" a# }
5 R/ `; h4 H- x5 H a# p8 s+ N
4 s, J0 R$ ^# s) d* ~5 j2 r: C1 b打开ST BLE ToolBox软件(APP在群内有615061293),可以看到该蓝牙已经可以搜索到。" i& j0 Z- C% G1 e. f" L" K8 {
1 z1 Z3 A& }( Q2 I# L1 `
* N4 S u" y5 U; v9 H
8 Z! i. B, ]! s; E6 A& ~
点击connect进行连接。3 n* L* S Z4 r, x0 z8 }
连接之后可以看到串口打印了连接事件。, w' M# T/ {4 \: y
) F! r! }* ?- e+ s0 y3 z. a& v4 v
0 z8 q- s" k, |6 { r
6 y5 T' T9 n9 n5 R' b( }8 R同时手机也显示该蓝牙模块连接成功。
, J6 t7 m! \5 z3 C
9 _0 J0 v- ^; B$ P
[/ d- D m- ?
|