|
概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
! t I) t; \1 w5 H* }9 H: ]* l" C
( E" j; @( M3 d3 U* G1 j0 [1 ^硬件准备9 o$ R, A! ^# U8 D# ]+ |
首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板:
) r1 \/ i) c2 B( g; y9 { t1 H" Y' l3 r5 d& ]1 M/ Y) A: N+ P
选择芯片型号3 v( m l5 i, B e3 m
6 [9 q! b5 E: |# z+ n/ s. B* m' {9 j配置时钟源
+ a% Z+ K" L6 S; Y& z& A% T HHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
# M q; J$ K/ w. i2 G" a, N1 _9 f7 Y, d7 t* A1 q
9 H& T- N" i, p8 ?1 e; V, P
配置时钟树9 O) R& w1 F# K i
! q$ H N2 Y, B- I
+ p# ^; {7 m7 ?4 p9 v- I( V& n
查看开启STM32_WPAN条件
5 O+ r9 X) D" ` 可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。 2 f% _4 S2 j6 J1 D
0 j# j* U$ l; {6 ]$ G7 W$ m配置HSEM5 l, e* l- Y$ v" ?
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
7 M( l8 ^+ u- ]$ @" K3 h4 l$ B, Z& X* C7 g
/ [1 ~( m9 o* R0 P) n
开启HSEM如下。
) T* B4 {0 h/ g" C0 V6 M9 D. N8 ~5 B8 g6 n+ _) i1 D
配置IPCC
2 a/ J4 A; v0 o 通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。6 D; G2 H, T. l e2 N, l
% b( T) F/ ^8 B) @
9 C) _2 }. i: w" K
开启如下所示。
/ G! j# |! A' F2 _8 d7 W* n8 v& ^! Q; U3 U# h
配置RCC3 h" Y( L7 D3 j1 \& z0 s7 O2 k
% K, o7 e- J9 ?5 \
+ x. W# X) j+ K- P, a启动RF
2 |2 z, ^1 y+ ~ _9 a: l8 G9 G. O3 f; y; G
1 B' i3 n" C6 z* K8 U; I配置USART, `. O( o1 I3 D
7 y' Q, \. w- {# o
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
* B1 L, h. i6 m2 h( w' E8 F; L$ a5 k! h" E
+ o* _) O( X( j, }+ o: m 开启DMA。 9 `' U8 {6 r2 x5 }$ X/ `; a1 u
+ D5 i. q' e) }2 z k
开启中断。 2 m1 \9 E7 _" G9 Q) k$ \0 P
! w: _) h. z* u# T/ B 开启STM32_WPAN K6 I' h/ T0 b ?
由于我们使用的是蓝牙,故勾选BLE。
0 r) N1 A7 b7 c7 C3 {
% a- d' I2 T# ^ 配置自定义模板。 5 `' T; [! [9 g- W# i7 [" q
) [ f! ]' K' B" W6 {- Y" O
设置串口1跟踪。 % p' x' T4 Z$ v$ |' F
! v! c& N! s& \7 M3 E) \% ^& g- v6 l 关闭MX_USART1_UART_Init函数的生成。
" ^ |% N; p: P6 F
) F- E$ ~* C9 I J3 a0 u, q 启用串口1的tx的DMA。 - F! z5 |- V3 O- H* A
; z7 e3 y9 d! X
启动串口1调试跟踪。
' q: C" z6 D! V/ ^: _; E# N! U
3 F4 T( N5 c0 `6 |/ s+ C: e
启用应用程序中的跟踪 。
) [& P9 [1 n# [5 c! B
7 U! U" K' o+ x7 _4 A( Y0 t
设置蓝牙名称,名称为MY_BLE_DEV。 4 C6 l Y3 G/ N! r
9 E3 P( m" L; Z" S% E: @3 m* _ 设置服务器配置。
9 c% e+ S. I7 j7 p: _7 ]$ j4 ]4 X, I3 N: n; @0 |
设置特征名称。 9 Q3 X$ z! `* j4 z9 i3 f# T
/ I4 b, Z+ O: p/ [ 使能特征值读取。
) e& z1 ]- f$ g8 B
) Z \9 W% m* ~
关闭GATT事件的返回。
* ]* m. L& y1 m' M- U- L
( ]4 W2 y5 m% O6 ?- m
设置RTC和RF的时钟。
$ e8 x" s& x3 D! E! T# s, J4 f! W5 s* P* W6 C, S
设置工程信息
3 S3 z# S/ \7 o7 b4 ]- |7 Q4 ]0 O( Z4 i) n1 t! `! G. T
+ w8 }) P( _# w# B
工程文件设置% |9 n( K, [$ {; ~
# N, C$ B( ?2 v/ R& R1 w+ T, e z
# [3 T" z/ {( GKeil工程配置! F2 u* B7 [1 {+ p V
N9 F- {1 q( s) H' @- W
! F$ j1 \" N: G4 H- }( c5 Q& \, }代码配置& N# {3 W' H$ o! g, G: G
在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */+ o0 Q, o: s1 f# W! w Y. e1 m
- #include "stm32_seq.h"6 c* ]! n. t) f6 H5 ~9 w, }' d! l! u
- /* USER CODE END Includes */
复制代码
$ |, R: |5 m4 l; k UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */8 r0 G3 s7 _! _. _
- while (1)% S1 S6 j8 c/ ]$ X
- {& j6 z& E/ Q+ C
- /* USER CODE END WHILE */( ]2 m3 j* P6 Q6 B/ h8 y
- MX_APPE_Process();
$ ^1 {% U5 e( @* y
+ U# ~/ d8 v( W$ b% ~0 [7 {- /* USER CODE BEGIN 3 */6 v: Y0 @2 V$ b7 U9 U/ I: q
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
" ^) ~: ?9 k4 _8 E" N, z - }
, d! E9 H1 E( D - /* USER CODE END 3 */, z+ S* p8 p6 L" F
- }
复制代码 1 u7 X$ m0 R" f! q3 Q- V1 T
在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )! @; e3 `4 B7 ?0 v5 f' ~& B
- {- h9 n( E) S+ ?
- System_Init( ); /**< System initialization */
2 A! S4 k- _5 T( _ - ! ?& n$ u" f% K$ B: j: T- R
- SystemPower_Config(); /**< Configure the system Power Mode */
" y3 D: j! T) c3 ^4 D, o
' f b/ @; |! o* g- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
3 D3 v7 Q8 E) \1 E - - x2 S- j4 d9 l; r8 ~. C- N
- /* USER CODE BEGIN APPE_Init_1 */
( o# G& Q" H# x# Z - APPD_Init();
( c% v* n8 T2 T1 v- y - /* USER CODE END APPE_Init_1 */
& V9 \" M+ E4 n+ @0 j - appe_Tl_Init(); /* Initialize all transport layers */
- p* L2 X: m2 W% R& |2 D# z$ U8 i
, K) v- _6 ~* K) C9 q" L- /**1 L/ C1 b/ T3 g- S& y
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )# N0 m) R5 G0 t5 {2 t/ h
- * received on the system channel before starting the Stack$ P' l$ c4 q( y' K& v. R: O; P
- * This system event is received with APPE_SysUserEvtRx()
0 e' g6 b {5 A' M/ P. g6 I( ^* v - */; F% [: e8 X: \5 b: e/ o L
- /* USER CODE BEGIN APPE_Init_2 */& p/ Q. V7 @4 u9 K0 q1 R
- 8 p4 |. m; H3 j3 h
- /* USER CODE END APPE_Init_2 */
' j U5 @' B% u# c% n6 F8 T% b2 S - return;' N+ q( c: Z& q5 e
- }
复制代码 3 X% `" g/ L! F
' m+ b X/ @1 x4 ^+ t: f
结果演示
& M+ f. O- v$ \* V 下载完程序后,可以看到串口打印固件版本等信息。 ; G' z- {7 r( M
2 g* {+ v4 K+ _% ]0 F- b8 X9 c
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。
+ _6 s7 a" c1 Q/ l! k" ]- a0 A+ H0 Q/ d% R
点击connect进行连接。 连接之后可以看到串口打印了连接事件。 ) x5 H3 n$ {2 t
- b% G: P$ U q8 B+ P4 Z# Q | 同时手机也显示该蓝牙模块连接成功。
. w3 u4 r" ~5 X' }" _8 w, d* h" ~4 k- X& O, |8 j" ` b* B* X# w
转载自:记帖 如有侵权请联系删除 / p) v! I6 i' a. ?! B" b' C; ?
- }, d9 b" J9 r; w' T
2 z4 T; F. T7 p" n" k, L
, t. V/ a; r0 B' ]" |: g9 ]$ u2 {& m" C1 z
|