概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程,并通过手机APP与其连接。
8 h5 @0 T- C( r6 o( z4 Z/ _: t0 ]! I+ j! j# Q
硬件准备% N$ Y. Z, t( v; b; C* }
首先需要准备一个开发板,这里我准备的是NUCLEO-WB55RG 的开发板: ( L2 E; B# I/ B5 l
$ U; U: K# M0 A$ F选择芯片型号
& k O. g- {, `
$ T0 l5 _3 O r& ?( {4 ]0 l配置时钟源& g0 ?, p. g0 h4 p) W( X6 t, E
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:' N4 z; f* V' }' E0 D) Q" \
; ]1 R3 M8 |2 Y1 D( x
9 i5 x: x' Y4 `+ F9 Q
配置时钟树8 p" N4 }/ H' J9 I! n
9 J' f( m) W, P) {9 L: ~! |* y; V9 D4 V' ~, _2 t8 j" F$ ?2 V
查看开启STM32_WPAN条件
- d: \( O' }# o 可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。 M7 k, p9 G6 v% S& o
# y. B9 r( h) d' I% ?6 f8 O% @8 \' _/ p
配置HSEM4 b- Y( b0 Z1 F
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
. E' w. {3 L! Y z: M
; N! z( Q* [1 q$ w
) D* U/ c* X) o( J9 ~8 c8 J 开启HSEM如下。
- h1 o1 T+ C# H+ |' W% Q# @0 \+ @% y H+ w0 A
配置IPCC6 s4 B/ J4 J, u- R4 n9 J" w( x+ e$ q$ o
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。* j9 Q% b# _' d$ I4 h; X$ y
8 W2 p+ Z0 D ^, b5 J, s$ ]9 I- A/ e1 r+ N+ ^9 z5 t* u
开启如下所示。
: V/ }) }# Q7 P/ ]: F4 L2 T* l" W3 H9 Y( y4 b7 h3 b
配置RCC' F# B6 d- a4 B: d5 Q; c. N
3 u; u0 S: n- \
; a, f& p( f* e6 k, _启动RF' ]' B6 x u9 M2 ~
* z8 G8 `% ]4 D. i6 l
, H4 d* i4 w: k l( C2 l# G: i配置USART
8 X+ o% g! M! N* x
( ^$ f/ B+ o" @' ?- @
我们需要串口来打印数据,以方便我们查看信息。 查看原理图可以的是PB6和PB7与ST_Link链接在一起,且为串口打印端口。
: D8 P) h$ x% ^# M; X; m) q% g- [8 o& p# F; b% } o3 I! _
" c0 J7 P1 s3 ?. A! l) X, w$ B3 C# J 开启DMA。
) r8 A# x2 w0 B8 p7 u- ?! Q
( o8 D* x7 u! L% P% K) W- ?( G
开启中断。
1 ]# Z5 u# c& I# c5 `3 i+ Y( N Z1 }
% \: W& _, Z8 K. E1 g9 `
开启STM32_WPAN0 h1 i( W5 R# A3 G0 z
由于我们使用的是蓝牙,故勾选BLE。 5 ^- J1 Z; C; m6 X3 f6 d
4 o4 [) v- R( o2 b+ H 配置自定义模板。
* f( x% m+ @3 g. _1 X
# A8 `: C' p( E6 E& m3 M6 M% Z 设置串口1跟踪。 3 A: l1 ~* `* d- g1 D- b
1 Z4 l# j& A8 a4 |
关闭MX_USART1_UART_Init函数的生成。 f2 q/ ]: d6 ^) t0 \
: q8 J, b/ J3 O! }" w- B
启用串口1的tx的DMA。
- H0 ?- b( S9 l1 q! f- Z9 m! `5 Y2 K* c7 W
启动串口1调试跟踪。
) t. h. V2 t7 ^& e% P9 p+ L, ~
6 f' W# Q$ k. R7 E, J5 b
启用应用程序中的跟踪 。 0 I- b, }8 {4 V t ~. G3 W5 P* t
& v! u. }3 V: b1 h5 m
设置蓝牙名称,名称为MY_BLE_DEV。 , U" C0 N3 d& l" y4 j
& t5 A4 ^, {- w- ^. Y f. |2 s9 Z
设置服务器配置。
1 S1 Q0 i% w4 b" Z7 S
$ a: J$ v( |, |; Z 设置特征名称。
: _4 c4 O+ \7 ?: ?
0 ~$ l" l0 W2 s 使能特征值读取。 4 i/ q% H' P( k' D: o4 C+ c
# N7 N2 H& `* a( y6 R. y
关闭GATT事件的返回。
|* R2 D" v- a. \' ^- W; D5 T, G
, s @7 z7 s. _# j1 i
设置RTC和RF的时钟。
, X9 k: c0 k9 T4 c5 A' d. \
& e. X/ q# `# U% ?- o: {设置工程信息
: O5 P" G7 e0 n! T5 a
7 L* F+ C; A8 i- f+ q1 h* ]5 `8 J1 o' A& c& U( r
工程文件设置
- \. u2 c6 a( O$ J& G0 K6 F) ^: o3 F
+ ?3 N6 q0 g0 m4 L6 H1 P% L1 a' @2 | D! l) F! y# i6 C
Keil工程配置/ o& G( c, e9 q. I8 Y/ L3 F
) P; D- ?' Q+ G7 p
% U0 E4 p1 K' K% `代码配置
+ V4 n% ^5 |' W+ \; H 在main.c中添加如下头文件。 - /* USER CODE BEGIN Includes */
2 n3 W/ P6 @% ]! { - #include "stm32_seq.h"
+ c2 C$ l+ i/ h - /* USER CODE END Includes */
复制代码 9 P$ m8 k- l+ }2 O+ m+ a- h
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。 - /* USER CODE BEGIN WHILE */( k- k9 N8 o' k% X9 W8 @7 b" f7 C! I
- while (1)
6 x! Y% B* w8 H# b - {
: `# C6 j0 X R$ n - /* USER CODE END WHILE */
3 K% J4 J; @4 T B! C2 ` - MX_APPE_Process();" Y$ R- i* b' l5 c
- / Y9 f4 `: i% h
- /* USER CODE BEGIN 3 */
" \$ r9 I: B* _. T. n - UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
# ]/ F3 k7 x l8 k. B - }
- z; [% k$ l- I- h% c Q" T q - /* USER CODE END 3 */
. w# @" L% \, y( L3 f# C3 } - }
复制代码
" ?+ ^, p! _; v, L 在app_entry.c中添加初始化 APPD_Init()。 - void MX_APPE_Init( void )" M; Q+ H. o; X+ |
- {. w. L- i" w: `$ @- a1 c; F- H
- System_Init( ); /**< System initialization */
6 d* {1 S; k& {
7 j# |6 f- j, y1 h3 G- SystemPower_Config(); /**< Configure the system Power Mode */3 r& j4 M7 j/ N6 f% g# S9 {7 X0 |0 X* J
- ; v; s c5 C& a! t. u+ y2 A) W
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
8 K1 |3 c: _; n( G% Z
5 b" s) H2 S4 T8 a- X) M" h0 o7 e- /* USER CODE BEGIN APPE_Init_1 */8 r5 I. k5 [/ c7 C) b
- APPD_Init();
0 ~! `! Y2 `" U - /* USER CODE END APPE_Init_1 */
3 N+ O5 r: |# |; l7 w4 V - appe_Tl_Init(); /* Initialize all transport layers */
6 \7 Q2 ^; o5 U4 q- I
9 @" N( l: o' |* N- |- /**
4 e) E& H( l! K0 P9 S/ o9 a - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )- v& t# ~9 [ l" K. I6 k# O6 R
- * received on the system channel before starting the Stack5 @$ d6 f3 V2 `# j$ G- ]! b
- * This system event is received with APPE_SysUserEvtRx(): j O B5 O3 d
- */
* h% H, }+ y* e. S" q - /* USER CODE BEGIN APPE_Init_2 */9 e# t9 e! n7 ?8 a: n/ E% |: k! w
4 Z: I1 k8 \6 ^3 O; z! p- /* USER CODE END APPE_Init_2 */
! v+ c; _ q9 h" B - return;
. {9 Z- B6 |* I9 w - }
复制代码 + T% Z/ u( Y& x, y3 d
+ n2 M+ y/ k: J: j8 Z1 r
结果演示
/ S! O' v# a7 x 下载完程序后,可以看到串口打印固件版本等信息。
1 @+ U$ O. X1 E
4 p. A* i' ]; U9 H. H5 J8 S( s
打开ST BLE ToolBox软件,可以看到该蓝牙已经可以搜索到。 . A9 p3 z, A. U+ b. e) E
4 u# G4 f) t% ?' r7 ]& W1 ? 点击connect进行连接。 连接之后可以看到串口打印了连接事件。 ; O1 H4 ]2 x/ f
: ]- R/ L4 p+ [1 ]) P
同时手机也显示该蓝牙模块连接成功。
4 }9 u. ~+ I- W3 c8 _7 L7 q ?, j6 J) x8 e( D
转载自:记帖 如有侵权请联系删除
) [4 _* F( v% E( S6 c* O! r% }" I7 I3 N$ c }0 Q
$ r- h6 q8 K% V* S
1 p. ?: F6 x* L7 b8 [$ d
4 n# d3 m% B& Y9 A. K |