套件概述2 X7 ?7 I6 a2 j; ]1 U! J" G
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
# Q$ h1 Y( i% B( V( r$ \$ c8 i
0 ? K/ _/ A; |
9 |6 n. W. Q) g6 y! k
3 {) {% h. y" B, y& _7 E' r( \选择芯片型号 8 _0 s4 l; L4 B9 q9 n
, W j0 f1 Z% F
9 ?7 E, } Y0 w9 k
' f0 M7 v0 _+ b% I8 D4 @6 }9 T配置时钟源
w7 N6 `) ?4 V) dHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
) h; O5 }, E4 A# N5 T A0 v- e+ V
: @& o# o2 q D) S7 ~) ~
3 h) C& J# _0 M, `$ H. g5 C
: u9 ?# B* R- ~4 [. ]
配置时钟树
! M$ q; D9 n/ l* F1 R3 n7 w
5 V7 r* W8 g5 \: w
2 {' W, I2 F- o& I5 j
7 E G( z# _ O7 ^* ~
RTC时钟配置
4 C& L/ E ^, }: o8 B* l- q0 F2 f) k$ N% p9 {
& d% X# Q& x5 X n1 M, P' a1 f0 h5 r; M; i- d& s) U
RFWKP时钟配置
! `% l( X, m% _; L# K0 q* m+ k) R7 m
' v, M( J% I. Q, y9 a
1 }5 U6 E8 ]& C: ^
$ V) g5 P/ h) L, U8 g+ ], L查看开启STM32_WPAN条件 _ I: @# [, J' N
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。4 r8 J& U% m! }- ^1 f5 _2 z+ s
. m) {2 }$ m; ]' x8 F# J X @
. Z5 x' U" y$ p% W- Q- H1 m. t2 s0 A. ?* B# I8 b
配置HSEM 8 e. H( }7 `- Z8 d
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。$ b' o6 m2 X( M; w
开启HSEM如下。
9 @( i% F# E' `! B' p' y: L5 F9 e, p
! |, t1 P, J/ D+ c
) J; }$ O" ^$ V, q; e6 h( J$ P
配置IPCC
& f5 R5 I" G+ }通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。& r2 S+ q6 g% O5 f
开启如下所示。7 _: ?/ K2 [/ _) S. v* e0 x0 v0 f
" Z5 Q. t. o; ^0 r) r9 G
; u5 G& ~% a T7 u7 ]. G8 r2 Z3 f5 _
配置RTC 7 _0 I; ~ k& p
! e4 q- c8 V& D& ~- F. E8 P/ f* {
7 H* Z0 y, c5 c4 S* g- U4 B4 ]
( @+ U8 t* F- f
启动RF
$ X% N" q. U! ]5 L* K4 q# I
4 D' G3 c7 e/ E# r
! a) `6 ~( |8 } V
4 }+ F S; q8 T, D开启蓝牙
4 l7 c# b9 O8 ^4 s2 B( p5 b
$ U. x( M6 D9 G Z) R, i
2 {& T0 I i8 b
5 _2 V! r, V* n- |/ j开启串口调试
9 ^0 ~# m4 d1 q; [" }7 XCFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。
6 t( Y2 \3 Q* Q8 r8 Q4 v
9 d0 \. ~; u& N' [: y+ `: D
! l. W, j& Y: c6 B$ b3 U4 N
* U7 h+ J+ h$ A1 f6 UCFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。
, |# R; V9 s Y- i6 O( p2 O' r
/ Z0 s5 X9 b: t1 U* L+ m- b仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。
: m* B+ |( S: P$ N8 E1 r' X' t+ W3 w) M$ [3 Z3 g
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。
& J0 N' [* e6 Y r& F2 ^; V9 A% @* c; I M0 Y
: S$ Y! c% n5 N; N( h! |: Z5 ?
( n6 Q4 z( F- N7 [* b+ T串口配置如下。
4 F4 g; |% V/ @3 C$ w4 w! s* l3 B: k5 i2 e# ?6 k1 w, j
8 e' O* I n2 d m2 J6 I
0 C$ X% D- J# z: N9 V% |
开启CFG_HW_USART1_ENABLED。" [ {9 e1 e3 U4 |
* y6 X7 X/ k1 k5 t, t! t1 k( Q3 Y
& z* P. m' i6 B7 F1 t
% b+ n- K( J. o
关闭MX_USART1_UART_Init函数的生成。
' p' H, W9 d( b0 x8 P5 s0 |1 L$ k7 l6 p' A
4 ? \1 T4 Z1 s9 j
6 { q" |" b( }" i" QCFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
" l9 N* G" c* n {
' W+ ~6 b3 }( Q6 j9 w3 D当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
" u( |+ n4 z/ V$ R
( I8 Q0 e6 e8 Q; F& n7 N
4 r: u: ]- D0 u! y7 p
- [7 b6 G: N; W
开启DMA。; e- T4 ?, j- d n0 R! q
% G+ N# |% k' u8 ]" K
, l7 I4 L7 {, u; M* o7 c, j$ d
2 [. `. T: P$ {1 z- e& S9 N开启中断。/ V4 r4 ?+ G. E1 u Y1 Y
$ c" v, R6 N* y( |
$ k/ @( t N0 P$ l$ [9 r" I
2 E& O4 ~6 N+ |* p. {9 ^3 R启用串口1的tx的DMA。
, J& @' z+ Y8 w9 v) F5 ^( H: d) z" u/ C0 Z8 x. P T
, P. b, s: k5 b4 F$ {% P% H* p+ W! r
+ \% y# X0 g) g0 [9 R0 x7 Z若无法开启可以重新打开BLE配置。
1 t. t) l- |3 `& y7 z
' S4 E' s4 y; @) U' H6 r
0 F7 P1 Q) x! R% B
! e5 |/ q+ b5 q5 v1 \% v7 q启动串口1调试跟踪。
. z* D3 C1 x4 ] F' V: D# q1 E% }: t$ A
( K) u/ h ?+ y* R1 H/ h2 M! M
1 e& @) ]. t' t+ f启用应用程序中的跟踪 。
5 m9 ` U. n" f! e
7 B* }! L: h" h! K' J" X- F
. T; n, j; I; X/ p3 t5 ~; ?/ u" w! _
3 I0 y, @/ J+ u4 Q3 }, j配置蓝牙参数
* G; j/ k3 Q/ Z5 i h+ I& }7 l配置为自定义模板。! W9 D( t* C6 u) F/ i# P# f, S2 W9 M
: C% g+ d6 C# x3 ?4 q/ b! l
5 j+ z8 S7 e: _+ U, {! U- V( ?+ g
/ Q! N% Q7 S7 U- k, o3 Y2 g6 [
命名设备名
. l% b( s! _# c# a. N+ m
0 w0 [, Z3 v" n, U F; t
, C! k! q( {6 T5 F* G
$ C- G; e0 D2 T. U4 z+ Q) @- ~2 K配置BLE GATT
' b2 M9 a6 _( c" \+ m
2 u* \& Q- w& M$ q6 M
9 `1 S6 S6 h, X# i! x+ e
$ q$ m! F' Z! H# F* W3 T M配置SVC
; s! T+ m: }7 C2 b3 N& J4 L, _
# e- Q- ^; b# J- u. x
4 T9 h$ n# {" d' t( z0 X4 H# ^! _3 x$ R
设置工程信息 8 z) U# m; ], u3 ]/ [
7 B: c# E! T' h, @4 _0 P, l
+ ?3 Z) { L( R& N T$ C# ?9 A$ S
: n# J2 R8 V6 H工程文件设置
/ y( }: y6 j! q$ l* \% B
0 M6 Q1 |; m! G1 c1 f1 r
4 O' K4 \6 u5 P: l: x7 f0 a6 _
s' M$ X3 N* X e. o5 c7 ^- NKeil工程配置
; O; d( d4 F8 h4 N. L" d2 t+ R" u7 {0 P2 W) Y( R& a" \% ~/ N5 I. w
$ T# L+ d: Y0 Y C: z9 v* u+ f
& Y6 Y1 ?( ~% H) m; b! O代码配置 * B; h& e1 d) v" [; a
在main.c中添加如下头文件。/ B" J4 n/ `9 j" A
- /* USER CODE BEGIN Includes */2 u9 o2 v4 P3 O% b! }' w, B
- #include "stm32_seq.h"
. d. A# P1 y! I: h7 q* w - /* USER CODE END Includes */
复制代码 , C/ \( c( F' q0 u3 Q# \
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。3 r l& d8 H$ e \" a
- /* USER CODE BEGIN WHILE */
8 d1 c+ a9 s: m4 n5 w; ~/ T - while (1)
+ k& Z( D; u& O* E# r ] - {2 a2 {' U, }5 O
- /* USER CODE END WHILE */
# q' }" Q' c7 ?# ?- h: {' p - MX_APPE_Process();
0 ^* o q# j8 c( q - 9 T. E- B9 F- S
- ( r) l9 C9 p3 V$ _2 o d; `3 r; B
- /* USER CODE BEGIN 3 */8 K$ E, l7 \! L- }9 C
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
H/ n$ W0 g( c5 J. `) p2 E3 u' ] - }
" p2 g5 c/ u+ l- U - /* USER CODE END 3 */! Z- J# p6 Y P; I
- }
复制代码 ! }4 j2 O; F3 p
在app_entry.c中添加初始化 APPD_Init()。
$ e" b/ ^+ ^- e$ x# Y7 ]- void MX_APPE_Init( void )
! `9 H: j. y @# `. n - {! d. d# y" |9 Q' Y( q
- System_Init( ); /**< System initialization */
/ \' x* u7 t5 |" W% o% u3 y
7 q" c( V% [/ [, l
- [7 L! u$ f& x- SystemPower_Config(); /**< Configure the system Power Mode */0 L9 y1 A+ W3 Z ?, l
- $ g" \ R- A% M+ s' ?* |
- $ N: J; H! z2 G G
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+ r6 F' n/ L5 X% O: {! M. [
8 c1 ~* c% m/ d1 D- r+ z- ?- $ E1 _1 n7 E5 `% _; B1 V2 `5 v
- /* USER CODE BEGIN APPE_Init_1 */
/ |2 \( e6 t& E8 G5 P0 R1 n7 D2 Z - APPD_Init();
' a! ?) T- b# N% \, e - /* USER CODE END APPE_Init_1 */
$ Q+ A$ T2 [% b# O" c# g) ^ - appe_Tl_Init(); /* Initialize all transport layers */6 k$ c$ p; x+ y4 r$ h
" s5 m' m7 E* O Q9 Z- 3 n1 m; v# ?7 ?
- /**
( p Q9 w/ P% i" U% c - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
0 z0 u' [4 p0 z# Q" \: U1 J - * received on the system channel before starting the Stack
- N) q E# g+ S7 l8 x8 u" q - * This system event is received with APPE_SysUserEvtRx() \4 u3 O% L/ x7 m, L* x+ ?$ H
- */
) K& Z; l9 p6 c/ c1 Y$ F7 E$ c+ I: j - /* USER CODE BEGIN APPE_Init_2 */
( B4 q! |1 C& M) |
+ l/ t6 I7 S. g) Z
6 s, {* o9 m$ n4 f# j/ i- /* USER CODE END APPE_Init_2 */
8 n; v! o$ x6 r3 M - return;. M* t9 E, ^9 l7 z; E) B6 U# [$ M; s
- }
复制代码 ) }7 y/ `0 p$ L$ G8 ]
结果演示
- g3 z3 a' a! [2 b在app_ble.c中,数组a_AdvData定义了设备名称。) Z: `! p: c( q4 V; S
( K, U8 G k `# m' V, M8 r& m
0 d- U `- o- n5 `- f* T; I: Y0 ? y
( Q) a! ]# C9 T; ^; v将设备设置为一般可发现模式,若成功会打印如下参数。( c8 s9 V! |; W/ A* D
+ F0 F) `9 W3 n6 N4 `1 K# r0 x1 G
, x8 V# U* n) ?0 w
, A; X s$ Q# h3 Y& u E: A* B$ F8 K串口打印如下所示。
6 b3 _9 F- y$ ?2 x6 P r& K) q
/ Z& s- K& H: F6 J4 @+ k
! I$ v N9 L3 @/ p* \6 j/ }
转载自:记帖
5 x6 y. U' I+ S% O+ |8 g% g! g如有侵权请联系删除
) J7 C2 T, C1 S* {0 K4 J0 L: n: K9 f; W8 p
5 d& |1 u! y/ |1 l9 Q+ v+ C ^
$ y; w8 l% X+ s5 p" z8 P( K8 I: t |