|
概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。 7 l, b: V8 w2 X. e! s" R$ u
9 L0 Y4 ]7 W4 j8 ] a硬件准备
$ g' _& Y- F6 L0 { 首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
6 x1 [* F7 f1 Y) c# R9 a" P0 \( b" i4 p% B5 H' ]+ z! w
选择芯片型号6 r# Q5 T$ F! U, g7 p% ^; O( n
& _' s% v4 W0 [! d配置时钟源
+ s- y- A6 P( h* vHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:7 G3 Y( |; m `- L& @
* O% [- w5 A8 U8 H9 w7 H3 m6 y1 ?9 o/ Y9 a* B
配置时钟树/ i% S% V$ e; p# U
) | Z2 C3 Z) q9 T2 ? R" E, Y
8 W" w/ w" q2 o2 q0 E4 O查看开启STM32_WPAN条件) O2 x/ @: } Z
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
3 N5 I5 G1 d: U+ Y; y+ ?2 a2 z7 s; p! f3 F$ {
配置HSEM1 \- {6 h R: {: x$ T0 \
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。 4 @- j% Z4 {+ x; u# ~
5 @: O" E% W2 E9 Z. p1 P4 q: S$ P
$ O3 G/ ^8 S* ~" l8 `# @2 E 开启HSEM如下。
; a e. L2 _: _# i) [: P7 W. u9 b& {0 s: A! S3 N& O, m# l- m
配置IPCC
+ l: z! k" H3 J! h* s3 z, y' N 通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。% g; ^/ J8 _% c& z9 r
8 ]% ?- X0 e+ E& U$ I
1 z: c8 M" s! E: R* \1 J 开启如下所示。 ; e( }% `8 I$ ~" h6 |
7 d1 H$ e& ~: W配置RCC+ m) Y8 {# Z- X1 X' f
7 N- n! T2 y& E* D8 S" F
) A" ~3 c. F2 A7 ~启动RF1 u$ }8 S( c0 \$ B
! }# z9 f7 k5 n' w. F7 z' y+ e: s
+ N* s2 f" u1 n0 q' f% `: C
配置USART4 Z# |5 }; r* {6 K
* T, Q l7 E1 }7 L
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
* Y5 n- \) K/ V4 f" @) K# r2 N
1 z, _0 `; i( q) K# c; m0 U# v- n. E; d, j N
开启DMA。
+ ]5 z( @$ X, j& \
/ s( L& w3 ]" @
开启中断。
* ~4 S) ?" w7 e5 Z7 u7 [) i5 i
) P$ ]- S: V$ w7 k' Y 开启STM32_WPAN5 H4 o8 Y* k1 k
由于我们使用的是蓝牙,故勾选BLE。
7 H: _2 ~5 [( W0 J6 L" g) r; }
8 V1 q6 n4 x- F4 _7 p: ^* g o 配置自定义模板。 8 R X. Z5 D0 b" t3 D% b! z/ y- ?
( L: U/ |# M, y. r7 [ 设置串口1跟踪。 5 V+ j5 w0 R3 } M& m
. a5 g7 Y/ ~3 F1 ^# k6 e% S 关闭MX_USART1_UART_Init函数的生成。 * ?9 \3 M) E! d0 H) s) }1 ]5 R+ B3 y1 e
+ O+ Z# q" y. O/ m* ^ 启用串口1的tx的DMA。 2 d; }) z+ y( g8 i; ?
( y0 O* l3 B! ]) ?5 E/ ^4 q6 t 启动串口1调试跟踪。 6 R! ]2 k W- s6 X, q
* }4 l8 @+ h9 M: H
启用应用程序中的跟踪 。
8 D& Q, |; e. S# l. s
; I' ]$ _4 ^, a& \, d8 I4 S% s5 I& H
设置蓝牙名称,名称为MY_BLE_DEV。 ' G* i! Y; G! w; Y& Z* W( U
% q8 a- {6 @; h4 a4 S) c 设置服务器配置。
/ U" \/ X3 |+ p/ C; G, ^" F6 s. c7 v4 h8 D4 i+ F
设置特征名称。
' R$ Y1 @. [+ p2 \( j$ b
9 j. R9 a2 p. | 使能特征值读取。
6 B1 K6 r- q8 K' @0 q8 B
# C0 u0 J$ F0 n$ ^0 T# { f
关闭GATT事件的返回。 + Z7 U4 B7 ^4 o8 |" ~' m% f
* e# I1 {* y$ r! @; I I: |( y, V
设置RTC和RF的时钟。
" b3 J# }6 Z* D0 w4 g- I- c" e, j: y- j- i9 u! E
设置工程信息
" b- ^3 g) L$ j2 @6 D/ m. T' @( K9 [* l6 N0 n/ b; }" g
" s+ ~- Q+ K8 ]6 x* ^+ c
工程文件设置
6 w3 m M( b* ]- V
: a# W) y1 F; g9 ~2 J7 [8 u2 g6 e" y3 ~/ r* ?% f
Keil工程配置
2 r7 R0 g( J2 g( d8 h( Y5 W( H% L8 k5 ~
5 Q( U5 C- z- y5 i: \7 c6 s4 }
代码配置
* }+ G6 A0 w: y- @8 p, |8 l 在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */- z5 F, P2 J4 f# N+ R& S) _
- #include "stm32_seq.h". b2 i7 b3 H8 E- N7 }
- /* USER CODE END Includes */
复制代码 7 O( k+ x7 M. F) q
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */
+ n' z7 D! m/ p% \9 e - while (1)) K& Y5 I* N$ ?0 _4 D8 H
- {
$ o# w% W9 t9 ^ - /* USER CODE END WHILE */2 ?% V: V5 c7 v& |# f+ p6 H
- MX_APPE_Process();5 T3 Y, Y4 e% V0 i m7 H
- 8 j! Y6 ]9 G5 V8 l. p9 w! Z0 Q
- /* USER CODE BEGIN 3 */2 R9 N. _8 t$ t
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);2 f4 \5 B/ T2 M: G# z3 ~
- }( S- v s" \3 ?; Z& I" V% j
- /* USER CODE END 3 */1 A. Q0 P" b4 T- t6 A/ `; O# ?
- }
复制代码
' r, P* l# v4 I' i0 F9 t d 在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )+ @. S* u1 t7 V3 r% Z o& d) ^ K
- {2 {' k: i$ n, ?- y
- System_Init( ); /**< System initialization */" F0 R/ S3 ?8 y. x
4 I8 c" V7 `# I" J& K8 M- SystemPower_Config(); /**< Configure the system Power Mode */# G6 a0 E" H% Z. K" J) w
- 2 p& l! r5 A! ?3 I( ~: }
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
$ ~( i. M* q: C2 c; }; V5 l1 _. g - 7 R! E/ T1 O7 [) C2 Q
- /* USER CODE BEGIN APPE_Init_1 */
$ ~. {, W1 ~" M. \8 A" ]9 N - APPD_Init();
5 z- P; d0 J" X6 r2 d$ ^ - /* USER CODE END APPE_Init_1 */
9 {3 L- w [4 i, {$ e1 E. e - appe_Tl_Init(); /* Initialize all transport layers */. o% g C8 c- P0 s
9 s7 M1 \+ ~; k4 Y' [" f$ L! w& Z- /**
" S* o( {' v! Q n - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ g/ I( G/ k2 w- }( y' | - * received on the system channel before starting the Stack: M& a1 j# b! n3 x, j
- * This system event is received with APPE_SysUserEvtRx()
3 i& s4 C5 E7 Z4 B" _4 B" H9 { - */
! D9 T v4 @' L& n# Z - /* USER CODE BEGIN APPE_Init_2 */
) x2 }0 s& |- C7 y" J3 e! n
# q a# G7 V% ~ v7 [9 u- /* USER CODE END APPE_Init_2 */: O7 n! y0 c% R- x
- return;- A( ]% A0 W9 i3 T3 M% W8 K& l
- }
复制代码
" I- b/ y7 @0 ]' L& n2 S3 }! P+ y6 H/ d1 G9 W! c) z5 o
结果演示# U. i- a: Y+ D8 j& _
下载完程序后,可以看到串口打印固件版本等信息。 % Y; J9 U3 Z: k; L/ L) P
7 f) m2 A. A- D+ @0 K% Q+ P
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。 ( f6 Q' q. b1 j' R$ ?
7 F- d6 p$ o6 b: M/ u% S5 @ 点击connect进行连接。 连接之后可以看到串口打印了连接事件。
) E* w; J3 I# V/ I) n7 _0 G9 o7 S; e1 C; A9 H* o9 X
同时手机也显示该蓝牙模块连接成功。 , w/ d6 Z$ u2 z( \, [0 B
! I9 b ]1 r5 n
转载自:记帖 如有侵权请联系删除 0 W% L. N9 ~4 M" w
L; E9 K* D! U3 ^# Z D
' a, \+ o2 y0 S6 [4 y o9 B8 P: B
' \5 @& o3 M/ Y2 r0 o+ G5 |3 [, O
|