|
概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
8 w4 Q; v, r; w9 d) Z! J! U, c9 i) S8 t R, l9 X
硬件准备
e+ ]. J! ?- n4 _2 s5 N; A 首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板: * q3 x6 s t1 J; s; W
# [. R0 F9 c/ ?9 J: A9 R2 z
选择芯片型号
$ Y( q0 q# Z% h1 Q# F" I
& G* |- b5 x4 L0 U+ e7 S配置时钟源) U! w7 Y, e, D# o: H! ]- {! J5 @
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:( v( X; }" R% I w! w
% G% z* }7 T8 P& s# e: ~$ p
9 y, n9 [/ T' P配置时钟树
( ]. H; \3 n* i, Y7 [% }, }4 Q5 R' j6 ?; z& b
0 N1 @3 Z( c- b, {
查看开启STM32_WPAN条件
* `) y3 z) ^! u9 Z1 t 可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。 3 X" S% { o: G! ?: e9 r& |
! ]2 G! l# |! _配置HSEM
3 N( d2 H* m) z% o3 e2 p# I* ~ 硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
3 A( I3 g& d9 G' l6 j3 e4 ]
9 D M1 ?, F% _, q6 O2 e& v3 F( ]
, a4 @/ |, l2 \9 u- [4 B& X 开启HSEM如下。
% ^. y1 d. P0 {, A
% Q& A" O9 n6 i8 j7 u% i配置IPCC7 y+ F) v/ B, G: f) g2 ~
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。1 b. h/ ?$ W6 j! O8 y- ^0 u
I/ ^" i6 x7 W7 o- q2 n- I+ ^# s5 b# Z: ~1 O3 y& r
开启如下所示。
/ z& x# O/ K8 P4 c
( i& r! D$ O% `8 E: o: E配置RCC
2 A* b, u, }5 U1 ~8 E* j* A
4 i% v6 E4 e( M% t* q2 @' }9 Y; X1 p
启动RF
. z2 S' K. [; v& |6 P
, i1 R$ p: j) ~) U4 H& W, `& W% }( o+ I% s8 ~
配置USART
6 ?" Z/ y/ {8 H1 s) H' h" r" e
2 j- E4 b2 H- K1 h# R/ ~7 n1 ?
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
$ D; Y4 [" ~$ D9 ~' q [
8 A ^. Y% a! A% Z- m+ `: @; M- _% ~4 S2 v+ V5 M9 e- O
开启DMA。 . v. T: r- t& V! {$ Z
- n2 @9 C# j8 |7 K* [) z
开启中断。 $ W3 @, m4 b5 X' ~+ j. Z( r- e' \
1 ] o8 @4 K% k. \9 \) O/ ^ 开启STM32_WPAN* n4 c% L1 A: b9 q7 v) ?
由于我们使用的是蓝牙,故勾选BLE。
" {, X' T6 U4 m) R* S- M1 G
4 ` `! U$ t! o* D& u" i 配置自定义模板。
! A$ S. a9 i$ [/ Y; v
' I1 i" ?! L8 T 设置串口1跟踪。 " _7 H- ] s p$ i, u) o# m
3 G# F+ Q: H2 }4 b! g' i% ?% F
关闭MX_USART1_UART_Init函数的生成。
3 z" N, Z% E' q {8 h, S1 Q5 s3 j; Z7 g# y4 C. r
启用串口1的tx的DMA。
4 J9 r7 i" B7 a6 i1 s0 Z1 x$ X% Q( s% ?7 G+ Y3 b: t" {% _
启动串口1调试跟踪。 : Y$ B. x; n- f
% a0 j4 `7 e: T( O' w
启用应用程序中的跟踪 。
. I2 x$ x3 y" u5 B( N1 K
0 P3 k. M# M7 s4 v" s
设置蓝牙名称,名称为MY_BLE_DEV。
' [; ^" ~$ ]5 Q# B( F J2 p" l5 d3 d
设置服务器配置。
x# C$ Z2 R& T: s4 e/ x! v
7 C& K9 Z. P2 f" I0 o4 ~1 T 设置特征名称。
$ t( M" a4 o" r8 a# m0 a$ W3 b8 ]1 L1 T
使能特征值读取。 4 n& K2 F, n6 C0 n1 H5 `9 g: p/ C& T, c& S
' N" K; Q2 s* Y" s6 G
关闭GATT事件的返回。
* Q0 I- W6 W B1 A1 g
9 Z: g3 \" _7 d. u+ V
设置RTC和RF的时钟。
5 ` q1 @8 j& Q8 ~2 ]; l! c/ h$ g* c1 p* Z7 q) t' z
设置工程信息( z( s7 x7 C9 e4 D) P4 L
- ~3 i: w# H* M+ g% b
0 {% r. I0 K, J工程文件设置
" M, \) E# I, |
! h2 n* A2 L6 O1 K5 i8 M. C- F7 R2 V) L' `! R0 X
Keil工程配置, x* ^% c. \- W+ T* K( A( e9 o6 S
k3 W6 ^0 W" G; v, A: q$ L! y' i! _: N
! ^1 d1 e h3 i" V, D; m$ \
代码配置! L5 E/ x( V- g+ g& X( l! G
在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */
$ }. T% h5 m/ ^3 R - #include "stm32_seq.h"" n3 W2 u k/ J& U
- /* USER CODE END Includes */
复制代码 * o* L0 R" K* N& W5 X( L
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */" p, E8 R( ^+ Z
- while (1)+ e# _6 A' o& P8 r; t
- {
6 `9 p6 V% i# U% P - /* USER CODE END WHILE */
6 `, U! \ X: @) K% g - MX_APPE_Process();" k4 P& \+ P% e \, K: c7 K0 K
- & m: a! w8 y: w3 F3 Y; Y3 k
- /* USER CODE BEGIN 3 */& G0 t. I/ i9 [+ d
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);. C5 I3 v1 `0 n
- }
1 l7 ]" I6 L, S8 ^4 x: ?. m - /* USER CODE END 3 */+ l: N4 T4 L8 Z9 f/ v
- }
复制代码
9 S& u' W6 Q# B) ?' l 在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )
& b1 t9 A) z1 s, z - {
1 Y# F& r) y- H1 O - System_Init( ); /**< System initialization */
2 `& Q, p4 m: Q - 4 w1 i5 w& e- Y, R: t2 A, H
- SystemPower_Config(); /**< Configure the system Power Mode */, J4 _) v9 |0 {, Q% o
1 _. m' {+ W: ?. L( T' _, ~- r- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */9 h9 Q/ o0 X8 q2 j- X/ \9 h
: f" s- _* G3 o- [0 ?. y# e5 i- /* USER CODE BEGIN APPE_Init_1 */
8 E( W" G9 R @ - APPD_Init();
5 u) y4 r" k7 G; c: R1 K+ ~ - /* USER CODE END APPE_Init_1 */
2 p6 U6 \$ c5 i, a# s/ m! a - appe_Tl_Init(); /* Initialize all transport layers */
; ?) v3 \5 j. g* U) j% b* r - % b' L9 I8 m( t ?
- /**: X5 a3 C' c5 [6 A2 y& ~& }& T
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )9 W; q ?1 n* d
- * received on the system channel before starting the Stack
7 L; Y H" j7 J, b' ^ - * This system event is received with APPE_SysUserEvtRx()9 A# s( j# H) A& o
- */
( t' e/ t K+ K6 u4 W - /* USER CODE BEGIN APPE_Init_2 */
4 K5 j2 p$ h) O% X# Y! k
, H6 V8 |) G! ^ A' N% E- /* USER CODE END APPE_Init_2 */% i5 ]; d+ Q# Y% y
- return;( b: h8 T4 h2 a/ {
- }
复制代码
4 k9 R) F6 ~+ o* B: G3 s3 `
?& w% ^* l' m& e结果演示
5 O0 E) x$ a4 R2 L3 ~& ]7 a 下载完程序后,可以看到串口打印固件版本等信息。 ) l y& ~6 y: \
: r3 S$ u! T! |3 H5 Z
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。 9 y: j" q+ V" Q7 A8 E- ^! ?9 o
* `( p# N4 p6 R
点击connect进行连接。 连接之后可以看到串口打印了连接事件。 * \/ a8 t) T7 _* W
5 d, H% V, W+ p 同时手机也显示该蓝牙模块连接成功。
; d3 G0 R/ z# _1 @; k) C2 h
. h9 h7 }8 Z' K6 r) D* S3 c转载自:记帖 如有侵权请联系删除
, ?" M0 B/ u1 ^0 C, U; w& g2 W! S& }: _( \+ a& d8 _8 w
; X" r; c/ m' V% e- g/ _: Q* w) o3 k# k4 [9 E
( L+ G/ c2 k) c' M5 C7 p, M7 n
|