概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
8 `" m' s( Y) d6 w W1 F2 g$ I6 K0 p% h' P- W
硬件准备+ F; j0 q7 Y- A$ F5 i
首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板: ; f% F" d2 c4 L( Y# |9 ~
& ~! w2 [# i! R9 w% n
选择芯片型号
+ p; x4 F3 H% V7 m1 E( N: r
8 O* S8 G* Z; w# U! X1 v2 C; \& o配置时钟源
+ H4 g* c5 x2 j; g/ ^$ HHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
3 ]+ W2 h+ Q2 y7 I* x) f- m) @- r% M) n! o: ?: r3 v! ~( H x# n0 N
, K; n" G0 s9 {4 h; }7 a
配置时钟树
1 {9 p( W, D' J, d, T2 b( U: R+ o" e2 V) C" w4 Y
3 [3 m" E0 v# v/ T查看开启STM32_WPAN条件, |; O& S4 E. H7 u
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
3 F, T+ w# y5 h4 ~9 E- y6 _0 t5 c
) v) Z, ~# S5 k配置HSEM. Z- ^+ H& o6 f
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。 # z- W5 b% ?5 k. {1 K3 i( p5 D( V w) X
! n" N ?; w G0 ^% T3 f; L/ [+ s p* }9 V9 {! y5 q
开启HSEM如下。 & u% _$ z' B9 R& w
* K- y7 ?2 _/ \5 e$ Q5 i
配置IPCC
# j( u# C3 b7 w+ j3 U; G$ d' a3 B 通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
5 Y* [% J9 U5 I; `1 s( ]+ \4 W) q . `) w! X- b! p8 m+ s L
5 Z8 A- l# g4 @
开启如下所示。 4 L P$ I& H9 h; F I3 M. q
/ L2 i& n4 |: N4 K配置RCC O) Y- W0 v* R, r# X5 T# v( y
& Q" H. \, G5 b% ^
; Z2 J5 A, N$ t) C% r) [' |启动RF
: ]' j9 d, s" b! H
) ? Q; ]* o8 c% w% I, A3 G L% I3 i. k( B" z6 U3 [
配置USART) a* F: ]6 f. C( J, o9 v4 k
% I6 n5 v% N2 m6 a. d" h5 `( q; C! d& H
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。 9 }) J. m; k f+ W- F* q/ B
; t& l' C% n7 b
" X' r8 O' ]: k) d' B0 H4 x- g
开启DMA。 ' d, X% A2 C9 p; D) F' p+ a
& h& ~ X' a' Z2 ?
开启中断。
0 N- F, Z3 a* g+ E# ^
* _. |! G `# T1 c8 [4 r
开启STM32_WPAN& V! s: q, ?) x1 L
由于我们使用的是蓝牙,故勾选BLE。 ! `' R( R0 H; b5 D) G9 m q) O, _
$ ]+ m( F6 q- t# x3 N& o& t$ s& o8 \
配置自定义模板。
* c2 }) R8 ] b' Z, G/ T! P
3 x* c5 M, @! H2 ] 设置串口1跟踪。 ; w2 K$ e: A: `: X9 a/ M& `
3 W- o: A. _! L( @' t m
关闭MX_USART1_UART_Init函数的生成。 3 v7 |: Z, v) e" Z! ^1 G' X; }
2 h: J3 T p# X$ d
启用串口1的tx的DMA。
! w! X! d% S8 F+ A1 \1 M$ M
) I( o1 s6 c$ f% h- z 启动串口1调试跟踪。
$ q4 ~* a+ _# @ S; U8 X
8 p5 F. d( s. R; z
启用应用程序中的跟踪 。
$ y( n" P/ ]. f( ?* E+ h- Z
" e, X' x! W9 C% B
设置蓝牙名称,名称为MY_BLE_DEV。
) P( ~7 O; k6 |4 m7 t6 \1 g8 C: s' h0 y% I# \( Z$ x B
设置服务器配置。
% k. H6 O* @) u0 W C( s* x3 g% H7 y; _0 N
设置特征名称。
$ }( W+ D5 ~8 @2 Q# W: y: `) \. G/ a# C
使能特征值读取。 9 |9 ?$ Q- o2 c+ v
9 Z/ ?* d7 G- `8 G, i" H
关闭GATT事件的返回。
# Y2 o+ \: `4 L! b
6 h( B3 T/ l" x* T
设置RTC和RF的时钟。 & C! @& z% W! `* f) o7 |% i/ s
* B' |( g6 S2 J# E) o+ t M2 }
设置工程信息0 g$ U. r& [* U- U" _; N. g
- j4 { Q) D! l1 t" l* E. n6 c
. `7 n& G& W' k& n工程文件设置
: V L: S- N6 T9 r+ Y( u
, H( q, n( S/ j) u7 x+ S7 R( t6 u% U$ e7 z1 V
Keil工程配置
' l$ \0 p4 [9 l1 Y; ] q- z1 p# w+ H- w' g, o
; j' `$ H( Y, I0 [4 S8 m* r% W* O
代码配置
2 C3 o4 ?: D& N t, q 在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */
+ G9 E) D H; F+ T2 e$ I - #include "stm32_seq.h"0 J5 Y$ M# ~ q1 [$ n4 _& O' f" H
- /* USER CODE END Includes */
复制代码 3 H/ J# I# n# z6 P3 F
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */
/ Q# k+ C4 f( g - while (1)& j7 c; t' J' R8 V+ B( d# h+ K0 V
- {* b/ ]9 p* L8 T4 c; D7 b2 ]4 c5 S O
- /* USER CODE END WHILE */, L/ i# V. @4 o$ V$ q4 v) |
- MX_APPE_Process();4 g/ [ V- |- l2 I) l
- * j$ n* W+ V0 L% L w3 @# V
- /* USER CODE BEGIN 3 */
1 ~" F4 ?# z: V' d: L - UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
- |! ^/ t( `2 k; y* l. o' o5 T/ P/ ? - }/ g2 ?9 b7 K" B: S% w7 x) j
- /* USER CODE END 3 */7 Q8 M9 V% K6 U: E* v
- }
复制代码
/ t: o' @, v' Q+ e" E6 [ 在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )
! Z& m# n& o1 J1 ~ - {! F, T9 Z( W" B" Q' W& b! R J% }
- System_Init( ); /**< System initialization */2 }5 M# U7 z) E1 V @4 ^
- ! |) W' `% M. P2 z+ W
- SystemPower_Config(); /**< Configure the system Power Mode */0 ?# s& ]* {2 w$ ?& ^
- 0 O9 Y2 k$ S/ J5 X
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */ \) i' p ` \, s$ f5 p$ G
- . F* K) |4 B: x0 y' ?7 ^9 f
- /* USER CODE BEGIN APPE_Init_1 */
* }+ V# {1 ^, s3 v; Y8 ` - APPD_Init();
7 E& Z2 ~# C+ w# u9 M, i - /* USER CODE END APPE_Init_1 */
$ @8 V0 A/ v' K6 ^: m# O - appe_Tl_Init(); /* Initialize all transport layers */
& S# ^) i* i, {/ d
; [- h o3 q# s- /**- t: J" k0 Y5 P
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )* E. M9 r: _- L: ]( Y
- * received on the system channel before starting the Stack, V& ^; b' E4 @1 j+ i$ b v
- * This system event is received with APPE_SysUserEvtRx()5 U% u* L0 s5 R( k j/ B) O
- */
5 @- S" W% y( c7 t! F6 \0 y T( g; ~ - /* USER CODE BEGIN APPE_Init_2 */% \0 N2 P8 H( f) R p% |2 b# i
E/ z# M* q0 E- /* USER CODE END APPE_Init_2 */; `+ J2 T' _' e% a5 g; l
- return;: l4 c* Y1 A1 O' R* ^
- }
复制代码 $ t: [ \$ f8 Y$ k; n) O' p
5 x P2 i* _! Z结果演示
0 i) }4 _6 ?( y& E' h' z# [ 下载完程序后,可以看到串口打印固件版本等信息。 ' N' U* ]! ?- P1 y& P6 Z5 S0 c& N
% z4 z& y" W; j9 b) c4 l6 G( k
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。 ( k% g- @$ W6 J. y4 V1 v/ ?
0 x3 J& \) S9 V3 ~! N
点击connect进行连接。 连接之后可以看到串口打印了连接事件。
1 u. v, H3 J# ` F& h1 @
4 o8 I q5 o1 Z9 |+ C9 D 同时手机也显示该蓝牙模块连接成功。 ) Y( U8 k( [ l6 ^; L
2 \& f; _% X& o, \. K转载自:记帖 如有侵权请联系删除 9 q/ Q0 e' W# A( |8 [
( r1 A6 l0 ~; T2 {( g9 P
6 j7 S- `8 P9 \* T5 B+ ~5 |
6 D; J( J j& D; t. F
5 I* ^ d r$ N" p5 H" B
|