套件概述( e Y! c5 Z V( S) C; y
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。; g3 t2 b& i* v; |$ a2 ?7 Y
& p, B& s( w7 M) R* g8 {$ A
) f; y0 |- N2 G. X- P0 g6 V& \ q! D1 \
选择芯片型号 . p. n4 q4 Q. P1 _/ X9 W# P4 A
5 ^1 y- d2 h- l# p) D- S- `
& s# F2 l1 ~) ]3 X+ J3 N! t
7 K1 L7 H5 X* a6 E; i8 A配置时钟源 $ L5 i& P$ Z! i& f8 v9 ^
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:# B0 b; S' I. E$ d0 B8 Y$ o
! V7 [; ` C. i( M2 H
$ U9 A8 | A( B/ x. y* p' A5 I' P
. Q* ]6 W( ^- n7 `7 p
配置时钟树
/ M9 ]: _" ^& [0 N% Z! ~' ^# D) ?3 U9 {: F. ]/ U& Z
' r2 a: V& y) |+ X# L
5 Q. ~4 }, V9 p) v) Z' tRTC时钟配置
) _. q5 Y8 r& z- w$ Y* o
8 p/ a$ I, c; ~% Q! d9 I/ f6 {0 {
' y3 g( D3 f5 Z. F5 s2 v
' }! o3 X# O) ~) G6 x4 k2 u ^; LRFWKP时钟配置
0 B3 A3 s6 K/ N5 k* _
' d2 h7 L/ S9 m3 [+ _" n4 p/ D
0 q# {: `' ]( Y& l. W+ M
8 w# {; F# _8 |& u5 y
查看开启STM32_WPAN条件 % X$ a/ }) N8 G& m6 P7 @$ N
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。' d3 D* I, e- V3 L4 Q
2 T$ D' w4 F5 N
( Q$ @' E: q- V+ |5 L: d
8 O8 a) N. V/ v! X配置HSEM
; B# w! u4 j+ e) W0 P" b: o. f+ |硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。8 j& |: `! L* z l( h- u
开启HSEM如下。
2 Q9 P5 z5 @+ \: k
" S4 U( f$ R+ e) b+ c+ n
" L o. i( r* m" w# Y) j, `' s6 H5 }4 y) }" a) n. p, A' O
配置IPCC 1 O) u- A. i. K% j
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
3 N- B: {! B/ F' e( ~开启如下所示。
6 L" |8 \( U+ u% u
! w8 c H, Q3 B7 g& ^
) i9 \ Z4 J+ [3 v8 j; `* g# |" z# _& }7 i: r
配置RTC : m+ x% j% Y: V" P
; o+ t' w: E/ m- _+ ?* P
2 @8 A) F5 M3 w. x( W
8 I+ k7 J l1 M3 J/ g0 L启动RF + h }8 K( ?+ r
2 M0 v# o, Z7 I
5 g, u6 m! M: g$ O
9 p6 T8 T6 Q! i. L. B) c) \开启蓝牙 ( Q3 }5 ^/ B1 `* i
+ u H; g) b1 S1 D
! R0 D* [1 U! Q
, r h& u+ }2 p ^+ `开启串口调试 ' ^( |. w# m9 ]5 q
CFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。
' W0 N+ b) j7 K0 W3 `: G$ c1 h" b# r2 u1 T# z- j; l R( Z( @
* P3 v! h4 A, m
6 G) @. J& Y, J/ X* T8 i- x' D% K
CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。" j4 [3 i0 d4 Q+ ?# b8 D
, }# b4 c7 l; n* ?仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。& D% O* Y" I9 B O; X7 X- h
5 e. ~. o, g. H+ y. u F; U) t
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。
3 S/ g( B4 n' n" m
2 J4 r4 E9 S) x `
6 r; x) k8 d p1 U5 v4 d
: o* d+ z' `+ _& \0 a1 R; l! M1 m
串口配置如下。
- s3 D/ p2 a* o1 G w
8 e: k, p' x& a( b3 z
% H. X. S+ W- Q" z
5 U `' k, c. ?" |. N" W* z' T开启CFG_HW_USART1_ENABLED。* L) r( a) j1 K+ {- }' J- n G+ J
7 r ?5 u/ ^* S& Z! e7 ]
9 U' s& D6 k+ t' z5 t! x% F8 ~* T6 N8 g+ B- t
关闭MX_USART1_UART_Init函数的生成。
8 [% S& n' Z% v! O, V6 Z( ^
; t/ f. J7 X, v. G" H6 j; p
; J. G4 @+ f# h. F% Z' B V9 e. v% ], E
CFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。 ]9 b: \9 O- Y6 n4 Q
: W& Q7 C) L* M3 ?6 `
当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。- F5 t' @6 z( ~* G, |" J3 u+ m, p
$ C, u' }3 u, F5 Y/ m' b4 I* V
3 s6 U2 X! i# a$ A) j" C6 q0 A$ J" }" Z8 {! w) N
开启DMA。" h* i5 O! I' F2 G
/ @* s5 P8 ^5 f+ v1 M6 a1 j
4 L( B: G* {( S5 x% _ H" [6 W. K. f% E
开启中断。
0 I, g# o! F9 H0 w* Y( f# X1 b) }. v- i; T. l* {, j. U5 ^, `$ v
' P+ Y3 p$ u" u8 c: E z% Q. n$ E- Z. k* J
启用串口1的tx的DMA。% t+ Y- ~% e: v2 c1 f" V6 y
6 J( X8 y% |- l+ f8 `/ X" C
7 B( Y9 t( v d* |
; T" L+ X9 u2 i
若无法开启可以重新打开BLE配置。
) k4 ~- |$ j; q8 H7 R7 ~
) B, G- h7 \3 J/ ?( K0 z9 }7 c
9 m7 X3 ?) y7 W8 d U T
/ O$ W( Q" }9 _4 ~7 B4 i2 i- k* m启动串口1调试跟踪。( S4 O! L. t! E% Y
9 O1 W$ F1 l3 v+ M8 d6 G- h# s
& H, |3 g2 f4 {+ O6 e* Z9 `. \
0 n7 H1 W) A: T1 N+ U启用应用程序中的跟踪 。
; k, `( {8 O0 p! C
" _( K% U$ @6 `' v9 [1 b
" [% g: h$ j* d' v2 k! W6 d0 H$ C6 ?% w. V8 {/ P
配置蓝牙参数 . E9 Q7 E: _# L3 R
配置为自定义模板。' \& j# }3 x. V: P2 `
. j) [; \4 J" `, {
" O) n2 A' B- X* Y8 M: c" _6 q. ?1 ?
* y2 `/ T3 F, H7 f命名设备名7 N2 R8 q4 w J" b; I9 ]
" v* k) T5 ]5 C
. g$ R, @8 `4 `# r6 J3 ~0 U1 X
J" }) ^7 z% Z6 W( B7 x: Z* R配置BLE GATT& ]5 n r; l% c, D6 J
+ I8 E5 e8 R9 g$ z# d) T
# {+ M$ j! i1 ]0 z& r
9 ^- v. L! C6 b
配置SVC7 v \9 l8 M9 J
; Y; }. }, M* I y
4 S7 l8 o' L& i* s+ d ]6 X
1 E8 K$ W( ^5 p4 j设置工程信息 - l. R) y& }: |" f1 X/ _
E5 Q+ V' {' ^" i% p5 h* x+ L
* K* b, h" S' b4 Y
& k- k( R" z! `4 J: N. p工程文件设置 + ]& h' N+ c) o9 U& d7 z
% }- \ t* @# v8 O4 q. M
4 R8 S( m) l+ B% l) _4 h/ D# O" J
: X" x; u0 t+ F/ u; c8 P; [
Keil工程配置
3 _. y, E* ^: l+ g
& k6 p [+ w$ D7 A
& L2 L+ d5 l4 `/ t& t/ E5 H$ g0 M1 a
代码配置 ) L/ _+ U* q$ }3 h" y
在main.c中添加如下头文件。
- |# b; z, _4 \8 j1 d2 F$ v& s- /* USER CODE BEGIN Includes */. T1 c9 ~; p: | N/ K7 I
- #include "stm32_seq.h"0 t: z/ v9 q. P+ G1 \, r! }
- /* USER CODE END Includes */
复制代码 * z3 O o6 G4 A) N
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
0 r5 @( y9 e. H, s! w, X7 h- \& k- /* USER CODE BEGIN WHILE */
$ Y9 m, I! C& J" a. z. O( I - while (1)
% A2 p. I7 [% ~. G; B4 q9 ` - {
: v) f# x) I: u8 p$ G5 a1 g - /* USER CODE END WHILE */- L0 ~6 G& g) N( c; W! M! G
- MX_APPE_Process();( }% ]5 U9 Z+ S' G/ J* L
* ], x8 Q. C4 o8 l& w% z$ Q2 X- * l, m( k3 s! m
- /* USER CODE BEGIN 3 */ u" A+ @3 B6 q
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
6 M9 Y. Z1 }2 m. p0 q: c# N - }' R$ @2 }% c: N0 i! J" w ?& }
- /* USER CODE END 3 */; c1 b' U" g$ h# v( q0 O
- }
复制代码 : u2 R! j# g+ O w" s
在app_entry.c中添加初始化 APPD_Init()。
: D) R7 \6 X( N: K# G- void MX_APPE_Init( void )
6 F. y$ |( p! S3 l/ @$ a, v - {
) g/ H! u. H7 m2 D - System_Init( ); /**< System initialization */, ?: K6 x! i0 G: {9 S7 M" B! t
/ h+ L& S- ^- \! a
& b# n. K2 I: a/ d) b: d3 Z6 v6 |- SystemPower_Config(); /**< Configure the system Power Mode */- Z4 n G* j# b* L# B
- + m; i) K( l8 M, _
- ) I, E4 s9 R2 ?# [: e3 d8 z
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */9 g( r# u7 g" m9 C5 X
- + E- {* r7 V& e& C$ r% T" G
- % B1 `2 y5 z" [3 d' A- S& I7 c
- /* USER CODE BEGIN APPE_Init_1 */6 e6 {, m( d+ v5 T
- APPD_Init();
" C4 O; J [: i# T - /* USER CODE END APPE_Init_1 */. w4 V6 {+ X: J3 q9 B7 {( I
- appe_Tl_Init(); /* Initialize all transport layers */
& |, T7 N2 ^3 F* N- h - $ i2 i! B. d) [+ r' x7 J3 x$ N; Y# K
f b1 e5 z) c k- /** _2 N; \, b) \+ p
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ s# ~* Y2 ^' Q9 k - * received on the system channel before starting the Stack
3 E3 C' v0 f- J - * This system event is received with APPE_SysUserEvtRx()
6 Z, R$ X; X5 [# b ^ - */8 j5 _2 r8 Y. Q) K& {: s
- /* USER CODE BEGIN APPE_Init_2 */
7 a6 P" ^, y2 w
: P ^1 ]6 P" q" B" w4 ]4 }
: _" ~* J2 L0 u$ K0 a- v- /* USER CODE END APPE_Init_2 */
1 A. D$ J8 z0 ?8 r1 R( N7 [, ^ - return;
/ B/ i4 t; R/ g1 P- l! G - }
复制代码 9 ?7 f. M$ j' x5 W/ I) z
结果演示
) F2 ^- l1 f3 h在app_ble.c中,数组a_AdvData定义了设备名称。
& r& k4 G! I8 ` E+ Z% Z) A5 P* Q3 O! q. S0 q! V/ ^5 U. H0 y
0 a* D) `0 I/ w% P. q: f7 ~/ M
! K9 Q. [5 w$ S* ~! }& Q, [5 a9 }将设备设置为一般可发现模式,若成功会打印如下参数。
4 S# ?: x1 ~8 U; q+ ~- u. s7 m8 s2 q) _
; q$ ^' H# r1 M# _
* E; L$ c/ O& f& p7 h5 [串口打印如下所示。
4 X" _+ E& z) y, t' H) G; T8 w- k8 P ^* V
3 \) x* c7 l5 x转载自:记帖' z, v3 `* o7 _# v
如有侵权请联系删除 o- U( _/ g7 b6 k6 G4 u$ @
. Y A9 Q: I# q& ?: B
+ ?3 w8 c: i% E; m
- F% c& x! k7 U8 `/ q1 i3 S
|