|
概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。 + C; J% y! d( |# P# n( M
* [' {0 a! D6 ^. z+ l3 R k$ c硬件准备
/ Q, v# K v K6 k% R4 n0 w9 m 首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
! [+ Q+ I. t! ]& e
; i1 K. o5 s- ^+ Y( ^/ [- u% c- F, v, \选择芯片型号
/ P) s; r' w1 |: @% n& a2 O
3 y7 q# j/ o1 r$ U! W2 l
配置时钟源 Z9 C: H) s* q8 ~! q! P
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
4 v8 @! p: U; Z- O6 d& D8 c3 g1 e6 h6 y6 U
& E1 \$ J/ T& u ^0 j+ |
配置时钟树: e5 g6 Q8 R0 ]8 x% c8 W9 P
0 o% @+ z9 t" F5 s) @) X4 F5 ^6 W6 P; R' F# i6 X1 I" J( [
查看开启STM32_WPAN条件# Y5 _. {3 e. I# j+ s9 T0 i
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
/ @+ v/ |+ M) P% f, N9 c# [; ^3 Z% K2 a4 [/ a8 ^5 n8 f9 E
配置HSEM. `, a- t9 Q) s
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
! F; l9 v% ^0 b/ P0 S! c3 ~! R0 t) ?) s, p6 C; S2 i' s2 M
# v- s" c5 v" O1 u$ J+ _4 s 开启HSEM如下。 & Z/ R1 w ?' F% F
' g1 Z0 P# Q D6 m+ A
配置IPCC* } ~/ \, N! F0 \2 v6 u1 ]
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。7 x/ J+ _- w3 q0 r0 Z V
9 f# q4 Q. w. N1 g7 E! w. R" ?
6 r; U$ C. M U4 u4 f 开启如下所示。 7 b; D& @% W1 a+ ^
i% X# b9 H) f配置RCC: S9 m2 u+ u. m1 u/ N" `
) j4 G# U- M& q3 f- y
% i: p- ~( I/ F; ^
启动RF
$ l9 J1 U8 Z9 n$ E, b0 M6 w0 J. o/ B' n5 y4 N4 E: O# a6 x- I& e
* o4 F; c: ]$ h, `. C* K0 d
配置USART
1 w: ]0 g5 V' G% X. ~# x _$ r7 l- n; @9 |. t/ m6 X
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
5 _- @" u- s h/ l9 Q# y. |' [* V7 T0 T/ y, ]- Z% V
$ K/ m0 i9 i: Q7 G* h1 Y- G1 v
开启DMA。 + ^6 q q/ a# W- Z H$ H
2 T% f; E! D. `& Z
开启中断。
( _6 V3 o5 n$ }; t* P0 O# J
: x8 r* d( H$ b* g+ `' l( H
开启STM32_WPAN
+ Z7 W4 g) I# @ 由于我们使用的是蓝牙,故勾选BLE。
: K+ O' r3 H7 a* B* x2 N8 E* J+ J5 F
配置自定义模板。
& M& h/ Q, y4 L; x @* _8 K0 M- H& e1 b7 k0 a6 ~
设置串口1跟踪。
( w; [6 \. V8 z& l. v9 m9 w4 ?' S7 P
关闭MX_USART1_UART_Init函数的生成。 ' o/ P; U1 x) V/ d/ }% c
; L; O7 j* w! S7 Z; @3 ?5 i) }+ O 启用串口1的tx的DMA。 ) |6 R# h( i, F5 M1 V, z& e
1 Z# Z4 v& `3 K, q. B/ Z' A- N
启动串口1调试跟踪。 2 N+ J& I- Q. \: v
$ \4 v( W) Y5 w4 L1 M8 W
启用应用程序中的跟踪 。
5 p) i+ Q+ P0 z- [+ _9 f
, X, F5 }; l- k9 H4 N% L
设置蓝牙名称,名称为MY_BLE_DEV。
) B1 x5 z* x( A4 M5 O6 z7 _- w' M2 C) Y) Y6 I, Q
设置服务器配置。
3 U. B; o. O) @; }" q1 v6 C# h8 a2 _& o3 f8 H0 f9 ?; Y6 ^) K
设置特征名称。
8 Z5 N& \+ z; \' i7 m5 R; R( U) Y" c0 \) i. K1 n: E/ w( S, ?' X, d
使能特征值读取。
4 w. N- H' i% R
7 `6 T6 M6 H5 a7 K2 d
关闭GATT事件的返回。
5 h) S/ j" s9 C; r( Q
# E" ?' E! }( m, c5 ]
设置RTC和RF的时钟。
' C; ?" [9 d" z( x7 s6 c8 p' _
1 S0 D9 v/ c! Z3 C9 K0 ~$ Y6 ?设置工程信息
6 o( D# ^" r3 l. S/ a0 h, `
( u- r' Z6 d4 w1 A/ l: E: g; m2 ]5 X& o' B$ H- d! r' n W/ I0 {
工程文件设置- L+ ?/ q- s* c, M3 |: r
4 b6 ^" `1 \; U+ ^
9 ?8 i+ ?) a" U+ I$ u9 J
Keil工程配置
" x2 y" o/ w$ O* b! X5 O, r; U. Q+ s& i k3 a3 U" q
# E3 P' K8 F8 |2 l% X5 G
代码配置
; F$ F7 C( K3 M/ g& F7 d 在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */. y( }) J9 O6 k' P. j5 F$ d
- #include "stm32_seq.h"
# l' D% [! |5 R - /* USER CODE END Includes */
复制代码 : a& @6 d& {- |' F; z
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */$ q( {, Z0 c5 I0 n
- while (1)
* K5 G; d% q, Z1 r9 t - {3 |/ Z( m, \4 c9 {* G* }& D
- /* USER CODE END WHILE */
! k; F! ?$ u7 F6 A! Z* k - MX_APPE_Process();
# z' e3 i. X; w* _5 ^. r- ^ - 6 ]4 U% W' G3 b* T! i) m
- /* USER CODE BEGIN 3 */4 |0 k8 n. o8 {: X0 h
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
: E- [/ a" Z& H1 c [' K" g - }, n' j" U7 d. w& V3 r
- /* USER CODE END 3 */! `, D! B D9 a. V4 T% d
- }
复制代码
) C' A7 _: |2 l' }3 D 在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )
# w/ ~3 p9 ?' Q" z, I' p - {) v( b5 L8 `0 ]' P4 d. e
- System_Init( ); /**< System initialization */' l* b: u1 F- R2 S0 \6 V. ^
- # {3 |+ v( [; f# U* H
- SystemPower_Config(); /**< Configure the system Power Mode */9 U! q1 l: h+ n* J/ d
( a e& b7 @5 }' Z- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */" v. ~. C* m/ l* i
- 7 O3 U8 {" G; L) ^5 r7 r
- /* USER CODE BEGIN APPE_Init_1 */- C2 a3 m" [; g' W
- APPD_Init(); {- H2 V$ b& `
- /* USER CODE END APPE_Init_1 */1 _8 E4 U% @! d
- appe_Tl_Init(); /* Initialize all transport layers */
7 R' ], V( H: j: [5 W
7 O3 m# m! f7 @) r# q/ r- /**4 g( M3 u& g' m3 [' B6 s
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )8 q4 O0 V/ x4 D5 r; l' H
- * received on the system channel before starting the Stack+ Q5 i& x* u* h2 @ }- y
- * This system event is received with APPE_SysUserEvtRx()1 |' u. p2 ?7 c( Y
- */8 @" D# z# v7 B5 \) ]% P' V
- /* USER CODE BEGIN APPE_Init_2 */
+ e- _. A, W/ V; `* {5 F7 u& ? - 0 ^* ~! P) a s3 }3 l7 f
- /* USER CODE END APPE_Init_2 */5 _; l: S( g3 T+ d
- return;8 J( g- p: j% R1 c
- }
复制代码
( A) C+ R! k: H2 X; x+ G& X' F+ r. M& b) e
结果演示
* U7 _8 g! [- x7 a4 X7 Y3 I! h 下载完程序后,可以看到串口打印固件版本等信息。 2 m' i) K' L2 A, V e' r. `
" n: ^0 O6 K" M. Q" L0 C
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。 5 p( I/ @; G1 ^3 S- Z6 P ^
4 X0 N6 Q1 A4 E: b. N0 Q6 O. {* A
点击connect进行连接。 连接之后可以看到串口打印了连接事件。
: e5 {5 E8 |2 @7 H, t- K
) v1 M7 F2 w4 G3 K9 X 同时手机也显示该蓝牙模块连接成功。 - m9 h3 g) f' P% b/ A
U; Z: T! _6 e4 Y; p3 K" L
转载自:记帖 如有侵权请联系删除 7 [: x+ ?, H+ ?8 U: c+ d
2 h1 M# i K$ D- }. P
) p/ r, |7 Y/ I* F' P+ A/ Z, O( _ l$ _# C
5 e3 u. C6 _% a( b# c% M. R |