套件概述
+ U; I- Q' j" n5 b( m: x8 p在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
. p* E9 R$ V0 p1 z/ {$ p3 m' `$ E& I$ G$ X
" m* K* Y$ g* [( |* j
( W/ i* C8 [/ \+ t
选择芯片型号
U2 o* V, ~0 G$ \+ x8 k9 t
- _( ~: H" u: V+ }) K/ ~
# S! b- J( P; F7 c' g, l* H
2 s% c6 b- B; x% o, K( X7 x @: A
配置时钟源
0 B. }1 f, R7 n1 L4 l3 S4 SHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:8 N6 L- A6 e% E
+ d* ^1 a( K4 _6 G
' `' L4 m. q4 V( y- H3 u8 a
4 N7 v% R+ E; [6 G. Z, p1 r/ p
配置时钟树 ) @; e; F* R4 R& L
, l" y- i# d+ c8 y% J7 a- y
' Q8 a7 w3 ?6 S/ ?' s9 j1 p6 O
: K- \ x( g& e
RTC时钟配置 : Q) @: F2 H2 N3 x; W" Z
( D- a- U. Z9 L
: U9 n; @6 g; q+ `- k0 T" y5 N4 Q- g" H! \% g$ @ @, E; G0 V5 d4 K2 i
RFWKP时钟配置, A) E O& h3 w7 H* J
1 \6 p! [! n" y0 X7 y' F
) d8 o1 ~" `6 l
$ y1 A) D( n2 a6 u查看开启STM32_WPAN条件 + c% Q& |# f ]: ^. i
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。( T' |6 x$ p& h9 Y/ r# K
& X/ A" w. K2 f+ G/ S3 l' [. @# F2 G" T; [
: i6 w2 C( E0 t3 n
9 ^/ t- f/ }1 R配置HSEM 5 i0 A1 E/ T2 Z, S0 X
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。! `; _3 o+ s4 r* {' I w3 x4 ^, l
开启HSEM如下。. }. O' P! v G1 E
3 ] h+ _2 a; w- K l( D: v- I
" f9 Z0 K% _9 Q1 `6 t
6 \; ~5 U& y7 b3 h* P9 W配置IPCC 4 [, D7 g' _ t" Y( W
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
7 R' K- K- p( V! y开启如下所示。
7 _/ p$ l7 w# {
; X. `4 j' R( J, p& r
" o: n0 g7 a% {7 D( J; Z/ K; X
& H6 }+ h! @+ ]4 q配置RTC
& H4 Y; w0 O5 {" H0 }3 u. _7 a! d
/ a, r J0 ]: F. z, X9 Y8 P% y/ `/ p. k I
. F+ \5 k4 m J6 u+ \1 k1 |: n( Q6 R. b& e
启动RF ; S4 R' {9 {3 r% E! r9 D
; |/ H8 z% ]3 s6 [( h* u: U
. c8 v p. {) B! J; E7 u( {& K) M8 P% p' J
开启蓝牙
/ U v {3 [2 C* i) x' y% H- u. t) v' v" H/ K: b* N/ M
0 ~! @% @! o6 J1 q$ Y+ z6 _! e) v- S6 u+ s
开启串口调试 ; G0 i; \4 }3 p# O* U/ F) L# y
CFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。
7 `! ]( M# _( H3 D/ f) o& d3 w% n
$ w# ^( [& W/ i' X- @
1 D# Q' X. i1 r# [/ sCFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。
. n* T/ R# t6 d' Q
( i) s6 y: [3 u仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。4 i/ c% ]0 U. `
. y+ K# P5 h% m; Z# v9 ^, B5 N查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。2 F: P5 g" A, I4 W9 X! x3 e0 a1 V! S
! G* s/ y3 v+ p) m! O0 @
; B6 b0 i( r3 G
7 A1 |2 z5 @& D: d: ~
串口配置如下。# e' C& H5 R" u& @
. G. ^% `( v( ?
) Q/ I/ _9 Z) z$ q3 K2 t: u
+ D7 F3 X/ u+ _* h3 k2 a开启CFG_HW_USART1_ENABLED。& b% e/ s2 J1 \
/ L P# ?# g# I5 {, I
( J( \& I) [* c! p8 ~
% f7 t' E8 F' b
关闭MX_USART1_UART_Init函数的生成。* }5 R( V6 W" u
0 k6 {; |( h2 X5 U( R5 j
4 W1 x1 {' j& B# o. p; A! G3 Y M% M
9 `5 u1 `2 g" k1 gCFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。2 I- e k* h: i7 n/ g
8 M# ^ ?4 G5 k+ o: z- a当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。" W; c6 I5 v+ H* s7 u9 p
$ [, q- j' t' W5 S0 o) f \
\% e5 I3 H" r5 e# n
& X* ]2 o. d3 V6 i: G7 I4 W |开启DMA。
; R- M- B- Q# R
- k* }" J0 H8 n9 X7 P: e6 m
# w6 N4 u( q6 e2 u/ M8 R3 Z& ]
- L5 @8 C) f" t: |. P9 f
开启中断。" {) ]: F; Q" Q$ p
$ Z# [; X& E s
# G/ G5 Y) T' T2 r4 p! q" {2 y6 w/ F4 o' j' P5 @9 s2 p7 z7 H4 C1 L+ x
启用串口1的tx的DMA。
; s% R3 T" S$ Q
4 v' z( {1 `! k4 P
) T' q6 }) D7 M3 J
8 d. q4 W7 q2 W* W5 K" C若无法开启可以重新打开BLE配置。
9 C; M% {0 N) U; \5 Y) S; T
9 e6 c# ^, K- k: f: ^# m
4 ~9 J6 C3 g. C% \* {7 l- c% ^: H/ @
6 I2 U1 I, K$ T& W/ M6 c启动串口1调试跟踪。3 a& U: b3 v0 Q5 a. H2 I' q e0 N
* H1 I3 K& B! }% K
& ^6 g5 n8 b f& l7 _# z7 u1 b$ u
0 ^7 N' j, B. k+ e3 s! Z
启用应用程序中的跟踪 。
$ X$ p! ]6 _3 m0 Y: o. ~; |/ x5 I( t% l& r+ S
' a9 r* M# r: |& C; I0 C2 G
7 z9 F2 L+ O# a5 n配置蓝牙参数 ! F+ Q: ^2 R8 K* M7 N9 U" L0 W
配置为自定义模板。
' z: I1 t! l' [! O; x" `1 W, o" ]+ ?0 @3 K+ p4 h' p( [: |9 y
6 }: y0 b! z8 ?9 _6 {
0 S3 F }/ t0 P% |5 N0 M0 a' @
命名设备名( s/ y5 R8 q$ y4 _6 j) p+ d. Y
% m# W! L8 m+ ~* @# S6 q, S
- V9 ~& i2 x) h6 }. M4 c
; c* p3 T- q4 b6 q" ^配置BLE GATT2 p, S3 L7 c+ ^
7 ^" U( u$ l' r* B6 I
# L% h3 @7 o3 G0 ]+ p
" {, M! R W7 {& M; Y* @ z
配置SVC% H# b' Z+ Z. O" e W( ?8 w
`% s. c8 Q I: j+ M# i
, n2 a' b" k+ O7 ` `7 B* I1 j* E# Z3 p: H9 Y( I# u8 |; x0 Z
设置工程信息
0 w1 }1 }# i8 ^4 o( e k+ {3 N! M3 i- K
) \/ Z! v. l; T; I% Z: H% q* F& z' H1 Y" C4 Z
工程文件设置 1 |& a' L: v2 o+ a& X/ w2 @- |
8 W4 J% f) N7 C
: D& v. Y" x6 q3 Z2 |. ]
& }6 h5 \ s/ o- s5 ?, d' Q8 k
Keil工程配置
* l6 r# M' a3 L4 n& d& V# v6 N K2 K$ I- d
" X% T+ e. [0 `1 v
: `' k) L$ S9 Y0 n6 n
代码配置 . t h7 ?6 |# p1 ?% Z. b
在main.c中添加如下头文件。
! R! @& v4 e( b5 g- /* USER CODE BEGIN Includes */
/ R- @$ a% n/ u - #include "stm32_seq.h"( H/ a7 K& W$ L3 Y y
- /* USER CODE END Includes */
复制代码
6 j3 M: [+ R$ r+ V( ?4 hUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。8 M) P0 w# u1 X# d2 P
- /* USER CODE BEGIN WHILE */) T [6 N% S2 P3 y8 m9 k p
- while (1)
9 H8 h8 @. _, b - {
% ^7 L6 V- g4 n% Z* L - /* USER CODE END WHILE */
5 a* a. r$ @. K4 e - MX_APPE_Process();
" q! W" a# `) _8 }1 t3 U - & |/ y1 l( T4 `* J/ }' F
- " L' T" K, |- Z: s" F& F
- /* USER CODE BEGIN 3 */3 f+ g# F# C+ f4 E) _+ m% ^4 W) e
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);) C$ ~+ M: N7 D7 R8 |
- }
e5 K0 P) j$ W3 m6 N K) s6 J# U, g8 Y - /* USER CODE END 3 */
+ e6 B- I; b7 ]8 ~. `5 Z. P6 D - }
复制代码
) ?$ [. j2 B; d0 u& X3 G0 F在app_entry.c中添加初始化 APPD_Init()。
9 v4 B: k/ B8 V( i- void MX_APPE_Init( void )
( p) K% A3 O+ w: ]% \ - {* O. \0 C a* K# Y
- System_Init( ); /**< System initialization */
2 t1 G+ a, ~$ o8 x' T - . c1 W: i- C+ ~! A" ^$ y m. R8 `3 F
. P. Z! B1 r6 J R- SystemPower_Config(); /**< Configure the system Power Mode */9 O; A, I2 q, o
/ E3 ?7 K% }" k8 l9 J- 1 ^, S+ F7 u* a# @, n3 s4 N- G
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */0 R0 R7 ?5 j* u0 j% h2 X
7 l% u( H( a- L( `! m% U) j5 K& l
/ g, @0 i$ v' J9 r% u0 `& c2 S( @- /* USER CODE BEGIN APPE_Init_1 */4 l, Z& D2 y& }
- APPD_Init();
7 N+ i! `! m4 H8 D# ?* z* k" s1 a2 n - /* USER CODE END APPE_Init_1 */$ y4 |, _; F$ ]3 q7 q* x+ |% o% ?
- appe_Tl_Init(); /* Initialize all transport layers */
4 o! ]3 r) F% a
% Y# `6 m( o5 x f8 Z/ Q" t+ y- 5 C% L1 Z% L X9 p+ K5 |
- /**
/ B+ s3 ]& B' R- D+ e. f% h( g - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
Q2 s2 C3 v. N( n: d; O* t - * received on the system channel before starting the Stack
, t, M7 K: H$ Q$ f2 ~+ O - * This system event is received with APPE_SysUserEvtRx()
2 Y' w, C& h i4 w# y1 ~: _ - */
& p- }$ |& `' a' U1 P8 p9 P; Y5 H7 C$ U' \ - /* USER CODE BEGIN APPE_Init_2 */
$ D9 S: I2 {3 l# n* V
5 O4 M9 g0 d1 w( G) H! B X Z- : A$ z3 a, H5 I% L! U' e9 S
- /* USER CODE END APPE_Init_2 */
- V3 m/ |' F% s3 k% u# Q# r; q - return;7 k6 B1 ]( \& w
- }
复制代码 : T0 x$ H b) e% N1 I( [$ T0 ~
结果演示 " s, X4 @0 p/ b, o% z" L
在app_ble.c中,数组a_AdvData定义了设备名称。
# i* U( i8 T q+ x
' ]: z7 Q- b% d% F1 K0 @8 X+ {& c
1 Z8 B1 C2 s9 R' ?1 r, _; q
; ]+ B" `$ r/ V2 S6 S- B将设备设置为一般可发现模式,若成功会打印如下参数。$ A' h h5 I; y% Z4 j
9 b1 O4 P! J! |1 f- ^6 [8 v
0 T) c& l, S' C9 Y4 n4 D7 Z: s
: X7 s6 Q4 @0 P W! e' t串口打印如下所示。
% L9 E; V& ?! P, m' r7 h' _
# }, L% d2 x9 W/ J( q c8 E6 \
& `0 i4 M) n+ Y3 m+ }2 J转载自:记帖$ _8 ]) T& j! m* ?8 w; S
如有侵权请联系删除
; ]8 s! M: ]! A0 ]' S1 G
3 n/ w6 R! l0 ]- f' {8 m! O
% c5 ~: i- D; a. S- E4 X! M! J, U( T% ~
|