|
概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
: n. I. }7 T- ?# n1 [. K" h; b% |+ ~" j$ g
硬件准备. i3 K- S" g; O d1 B6 z3 x* I
首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
6 Y: s1 _6 g3 Y
5 m& W# C1 j' X& l选择芯片型号2 n9 f |" ?) R, B+ `. l
, n8 u5 K3 R/ c8 W0 w+ F" V i
配置时钟源% r- P) H% O5 _, g2 t! c
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
3 h! G8 b; ?2 o# q
: P% Y f$ `& p- |* L* D4 T3 w# U# r" B3 v2 t' k6 w
配置时钟树* v+ G# f# W: B7 f. S9 A& U
. x9 z( ]: a4 n- v+ F: A% d
7 y2 X. M$ H1 H ?6 E4 h2 U/ o: `查看开启STM32_WPAN条件) t1 A: c$ R- y ]1 V3 ~3 _* K
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。 6 a4 O( I/ K5 k5 T5 p$ P
/ X: M8 V( G# E配置HSEM
% v2 F# B' c7 L: D 硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。 % i9 [' t' w4 t- P$ v( Y3 t5 Q4 |
" Q# R2 D- E6 Y" f; d( e; I! j+ Z
. `2 P) C0 f7 m; N
开启HSEM如下。
" }- l+ h; |/ A2 G1 `0 ?; }% |! D; t4 c; P' x
配置IPCC
8 G# l9 p( V! i( m* F) y' A 通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
* M0 I# w; p) W# [- q- |0 K9 \ 4 A- ^' r8 r% C# `, b0 {% Q+ I
" u( P, f" V2 w' k% \9 v' ^ 开启如下所示。
/ N+ T w0 j( D1 b, y3 ~7 i8 {
5 P4 ^( R- T' n5 }- j3 M配置RCC
2 |/ N; C N! Y5 f# Z7 `4 e# G: N; Q5 d
% c' z- D) x# y2 u9 X3 \( I
启动RF
( { l6 o& a- u" @2 u4 J2 \
- d8 C- \3 @4 G3 v0 C+ D
5 ?1 l' Z- q5 R# y* `配置USART3 u9 J3 j9 `6 S1 L5 J
' L) n% x7 L3 N" z% s! s0 Q2 `% p
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
: v4 y4 N/ m7 {; N. q
6 A' K% B% m8 `4 N. ~$ T$ |, T
, ]" i9 D6 T; S) p, h 开启DMA。
% s3 Z( f8 x; w
1 y3 k6 x$ b$ j. v: ~$ E
开启中断。
* ]9 _* h! e5 C3 I& S T* ` z
1 I1 w1 D" D# p2 N Z
开启STM32_WPAN/ \/ v! M- q7 ?$ y7 z/ o
由于我们使用的是蓝牙,故勾选BLE。 ) i2 y+ D, c# P/ e5 y1 w
4 H% P8 R4 b/ y 配置自定义模板。
: u3 p# m9 m" g, `7 Q8 ^5 j3 b; j w) b
设置串口1跟踪。 / `4 O, c) O, r9 M7 q- j7 F
) H4 v. X& R/ o! `* l0 ^9 l' Q8 P 关闭MX_USART1_UART_Init函数的生成。 4 m8 Q; p$ t+ [
" V. z2 n$ u8 o/ ]& v5 B% M8 c" b9 H P 启用串口1的tx的DMA。
4 ]6 z3 z/ ^: n, S) Y" g* O) d7 n3 b
, e# k. d7 T/ `% ]$ G! x 启动串口1调试跟踪。
7 I: F$ _4 }/ T+ o6 ]
8 ?5 ^6 Z2 a! |, S3 J, A3 Z+ S
启用应用程序中的跟踪 。
% K+ N( o0 }+ b% R6 @
8 i5 ?5 p" \- O
设置蓝牙名称,名称为MY_BLE_DEV。 ( c! O4 g6 D2 Z+ w4 n/ G
$ F- U% J. X0 g) z3 i- M
设置服务器配置。 . d4 g5 ?: w; ^ F3 `1 `1 F
( @% o/ {$ \; W" G- I/ l R
设置特征名称。
I2 \+ `4 G W8 F! i" H
v& \8 C5 ^& g/ m3 C+ | 使能特征值读取。
1 R( I* d* H2 h' H; x8 j
' T* ~8 H% _; U' F0 P( i
关闭GATT事件的返回。 : N' B v( P, Z: L* Z1 F7 b
. X" x% T l; S, d% ]% ~
设置RTC和RF的时钟。 1 G9 k; C& ~: y9 F
1 b9 \' K/ n3 P* ?设置工程信息3 [9 x/ r) o# f* ~
/ P! V+ n: x: ~$ D7 D y
8 j5 A9 D# k) T, P
工程文件设置" v6 \# x% i4 j4 b2 I# J
5 ~5 P% n# @% S9 v( Q7 h q
* I" t% \9 A' X U3 x7 FKeil工程配置7 R! R3 r g6 u1 E& A
+ W, Q5 E2 j6 d- B7 g/ |( O/ H
7 D3 w% S0 J6 O6 B
代码配置
+ @9 C% x( I; ^/ d" F W- ?5 d 在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */ J# S6 `9 H3 \ i" f
- #include "stm32_seq.h"
+ L7 a' b! X! h8 d - /* USER CODE END Includes */
复制代码
6 C. G2 a) P% j UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */; |+ z( J1 t0 o+ y
- while (1)
+ X X# {! w7 }, S9 l4 n - {! x" x) a9 G X
- /* USER CODE END WHILE */0 t/ J, R! l9 z3 F
- MX_APPE_Process();6 n5 v; g: C' Q- e0 ~9 b1 n* ~
- ) R2 W0 T" v5 D6 U( g% w
- /* USER CODE BEGIN 3 */$ b4 M9 v; s% K: L3 p5 g- E
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);8 F n, U6 J3 w" y$ d1 Z, r5 L
- }, K. Y( Z) M W( P6 K
- /* USER CODE END 3 */9 e# \! N4 P9 H+ u0 T. m5 I+ L
- }
复制代码
, s& k5 @9 g+ W& _0 V 在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )$ c1 Q) |& S! t: O8 T) D% ]) u1 |
- {
! p1 u& m2 V2 D* U7 M- v5 t/ s - System_Init( ); /**< System initialization */1 G5 J) d* ?' T; E, N
/ M7 ~. C1 M' P, E- SystemPower_Config(); /**< Configure the system Power Mode */: ?; O% ]7 U1 s% A. m% O* w) o0 E
( l A8 {6 _! ^, x! W5 Y- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */, r& Y2 D) x; l9 ~
- ; u6 l* Q4 G! S6 ~' ?
- /* USER CODE BEGIN APPE_Init_1 */3 I3 y9 W$ \! g, Q* X! h$ [
- APPD_Init();
. ^) Z/ @1 K6 Z/ { - /* USER CODE END APPE_Init_1 */
3 R# [2 a; a$ i+ t7 u - appe_Tl_Init(); /* Initialize all transport layers */, }0 l2 N5 E3 K- _% E$ m* T, N
8 m+ q. @' G- V2 t- /**) c, p1 w+ _5 b! ~
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
1 ?: b3 _6 Q9 V" y - * received on the system channel before starting the Stack' y7 j$ Y* ^3 c4 m1 t% v
- * This system event is received with APPE_SysUserEvtRx()
; [8 z' V* P/ N5 O/ y: r( w( U - */, w6 O' y s. a5 z; {
- /* USER CODE BEGIN APPE_Init_2 */5 b" w, Q7 q/ c) Z
- 4 W) u# K# k+ O0 W2 L3 Y
- /* USER CODE END APPE_Init_2 */
# C) x7 L) t' ^ - return;" a2 A0 m+ O: u2 e' k
- }
复制代码 : p v% J, {6 R
* q! z% p7 `, R2 Z; c3 C结果演示$ E+ H# X; X# Q1 B0 A
下载完程序后,可以看到串口打印固件版本等信息。 0 a# e2 p% D: j% e
; N2 q" Z$ K% i: c" j; D2 b
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。 * P- v# ]( z0 u+ p6 i) F# ^$ r8 {
9 n9 W+ c3 y0 j! L# B* p% u; X 点击connect进行连接。 连接之后可以看到串口打印了连接事件。 6 r3 [( J6 l: B3 ]
. d& g2 l- t4 [! G/ P 同时手机也显示该蓝牙模块连接成功。 : Z/ ~$ t3 [$ ^$ t5 x) j) ]" n
9 V6 H1 O% g) r+ `- m
转载自:记帖 如有侵权请联系删除 8 P5 [8 u. U) A4 w# |: a; j
f% x% y9 ?- J
' T0 s6 M: k8 z) _8 g" z( h: w) X/ X, W: _* u
8 @7 M( w. m& ~8 x/ g |