套件概述& A$ `( a' U/ I" A; K: \ L
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
5 K9 N! ~+ u3 i) V8 o, o0 {9 Y3 o$ b$ d* V% P! X- a
3 h6 d+ o0 y w" z' @" I2 v$ V0 K& U3 x/ M5 U# i* q
选择芯片型号 6 Q$ P* S9 X9 N1 P9 e6 C
, U. D% c; H6 |5 [4 G
: j& z2 j6 ]( K- w! W
3 p) s' t2 z9 W+ O; z配置时钟源
# E$ D9 r! J; NHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:1 I2 L! [. J! }: P3 ?: ^( L
% S. Z& I- E+ u
4 W, Z! ~' F. I/ d4 C% J
( W9 l2 a- j) d, A
配置时钟树 ]- S1 C* d% b2 p
; C9 m$ Y) L1 ]! G2 f
k3 h" l4 E5 l0 v. p+ H. r1 v
, u1 P: N: }" _( @* wRTC时钟配置
z7 a, D1 i- J: q- L7 R7 T/ H& u Y4 Q7 L4 r l! {+ g9 c3 D* U8 _% d
3 i3 b9 [7 i' D0 N9 P* ~: \3 g- b- V$ J3 x
RFWKP时钟配置4 y7 H6 ~+ c W1 N0 y
. o' S5 _7 `* Z2 o& P0 ?
# ]. b5 J$ |' h2 C; d2 {4 T
6 E6 f9 `. `" |5 }3 I% \2 ~查看开启STM32_WPAN条件 9 P w# Z: T" M& M. M0 D
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。! y$ b: r) q: T' b& z0 B3 v8 T, p
6 B4 D7 d* `+ A& I; a$ b( }( _9 i
( g* {( ^% F) r
9 M* i% R2 i1 V( [+ U) Y. \* k) `配置HSEM : Y2 K, k% D, a$ ?" ~
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
L8 R/ _* j, D N) n" c开启HSEM如下。. E& h+ j2 E, f- D8 a( O( S
, Z3 l' ?0 U2 r& s" V
# f$ b; [$ |' K) e: d8 p9 x' c' y7 n4 k% D" B# `# H
配置IPCC
% l0 n6 M! K; O, `, L/ ]7 q/ R通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
8 s( e% |! J! d8 s" G1 \3 \开启如下所示。
) h: `. }. u! c$ V& F5 ?7 f# D. W
/ E6 a& _' ]/ m$ S' `- a1 @1 T( P
, q+ O1 Y: P: y. i; X. r6 X; o配置RTC
7 w- l0 N# z- e" ?4 W: F3 Y! J' |! |4 a# V* r
8 Z# R# W6 M" f$ Y' I; M: t- y8 F7 Z
启动RF
6 Q2 J0 ~ \* Z( v- B+ A
9 a4 C3 | E1 ?2 _" R1 \3 o3 O
' t9 Z: H+ r3 f {- X" j
1 { u# ]: ^! ^) \& D开启蓝牙 ! U! ~! l; S7 ?& f% a) `/ k7 }: H
- S& I$ e* \% D+ d/ Q# w* Y
7 N/ q- d+ C/ V. R* f% z( ^$ [$ Z1 ~: ? w
开启串口调试
+ F& B7 c/ H' s" y( n# q8 C$ aCFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。+ d0 C1 ]1 o d; J8 p
3 _ R, M. Z: M3 q& ]) b/ U
" K8 ?+ t: `, h% V, U( g
2 X( z* p/ l. {" `4 d0 X* ?
CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。
9 X6 ~: q8 n: J9 w2 i0 P6 `' K% T1 l& F6 M' v8 H" e- P
仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。
* t1 R; R; B) t: L+ M' v0 J; u& g* k1 g, ^& Q( v& ?, K, ?; O+ {
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。/ w; a3 _; S. z
3 o* U" Q, {* C9 B0 d+ `
' d- i* L( Y$ {6 }5 M6 m5 d" y
: y8 A+ V# A4 O+ |串口配置如下。
, F! q; w3 N( T) B: J
) K% j9 C: K" n' o' q m1 m
6 l6 N( d( [# |4 N$ H" o: ^9 G4 E, o2 x3 D6 i/ X$ d
开启CFG_HW_USART1_ENABLED。# n8 C' O3 l4 b m# A( k% |
6 |& y V! k# K5 o
, `. Z+ ?/ a' B+ F( `* w" t# m9 Z& I8 a3 A) p3 H7 W7 N2 v
关闭MX_USART1_UART_Init函数的生成。' ^1 l- _4 g: E4 K3 P% v
# J: w& J+ T& b8 v8 L8 ~% ^! ?
7 Y# @/ O0 ~0 u' s& T) w2 h
% Y, ^8 b9 i `8 J, a1 ?$ m
CFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
, L% X v5 x' O" N4 |/ N. I
; w& v3 ^8 w& ]- b& S/ B$ o- L当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。" q/ F1 E1 Q7 {0 \: p, M
/ G+ m* l+ W( R' @' K
) g1 d; _2 z+ l' u$ G
1 _4 I2 Q' i% g4 I) l7 P开启DMA。% S% B( D& \) H. k' t% D
! Z% x [1 o* e d) Y- M" P
( u8 C9 U0 P5 ~0 c4 r1 P3 x: t: S
$ ?7 D! ]9 x- q2 y9 ]/ p开启中断。
. H! S ~) |5 @; C( ] @
' P6 h3 f9 e0 k
. r! I+ Z* t% R7 X3 K( h
! B: A7 }% s9 N5 {0 J; J7 b启用串口1的tx的DMA。
& k0 E$ b. s- X, g4 A+ e, _- G& v) e' {; s7 |8 ~- Q
7 w6 Y+ E, M$ j2 t' Y" n
. j, ~9 X; F- h, }0 s若无法开启可以重新打开BLE配置。) ~2 t2 \% `+ h: v1 a7 T
& k" [9 |" k! y& I; N6 ~* D
% |* }3 ?# I, ]4 Q6 U, {0 J
& A1 L) b, e) A6 U& c) a5 F; p启动串口1调试跟踪。 |8 m/ ?; B. ^3 p* O0 ~. P4 k
6 c5 I0 a7 u& E( H
7 C$ x. h7 e& u4 j" c
& u% a8 v( C+ E* T( n# r% V, k启用应用程序中的跟踪 。8 O) i; I+ l: e+ ?
" j( d; e# x% D4 c7 B
& W( g' u# o3 c5 \! K k2 ^0 a( ^) E' Y" G9 ?$ e, Z- u) o
配置蓝牙参数 4 M: L) Z N3 o4 r" w
配置为自定义模板。
$ ] Y( c6 W0 F; L: i5 R$ w
0 f& U) \) C1 x) I0 ?# p
* O& j z# T" i- Y6 ?8 p- a& H1 @; l0 t+ c! |6 u
命名设备名: q! g1 f0 q5 x5 J" |
0 x4 A9 ^: U9 Z @
4 i6 H- T% d. O! }2 i- w) P, I
3 p1 s7 V1 R- E/ H! d3 W) f S0 l配置BLE GATT
0 d9 S: V0 [( R5 P# B
, s N' c/ W# c) D6 O+ R# G
5 k: ^% `' Q# U G4 G' k
) Z) K; V, T: |. j: Q配置SVC
1 l; d2 v0 D, h! l9 g; T: I; D$ Z, e# @' n! ?9 s
/ b( \% d: O" o% p) g
7 Y! Z% P! H/ L1 P! Z6 X r' l2 k" E设置工程信息
$ l3 W* H" A/ ?1 d2 k/ `
1 D0 h- |$ @9 P+ ^0 U8 P. Y. X5 x
# K$ {2 v2 G) P8 O, T1 d" p, i+ m
工程文件设置
- U5 w6 m$ i6 c, S/ M7 y' r( T) i
9 ?) _: G4 E1 m4 Y2 L) S H! j2 X/ x0 a
Keil工程配置 7 x4 @8 n! e/ Q) b3 N- t4 s0 |/ t u
; f* r& y& ~( j( ^6 B5 o
* w' O0 b' H5 R- I2 Z" m0 M3 q
/ i2 G- h8 N2 A+ n y5 U
代码配置 9 s; y% p/ K! Y
在main.c中添加如下头文件。
z8 A! p% a5 D0 `0 R5 ]7 U- /* USER CODE BEGIN Includes */% J7 w% J1 z( {" e2 p. \6 r
- #include "stm32_seq.h"# [: g% x: f( v; n0 z6 ~
- /* USER CODE END Includes */
复制代码 8 c' F! h, {* s' n K
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
8 s. L6 f. Z3 a, _0 a3 L- /* USER CODE BEGIN WHILE */
; I' v# }5 }( H2 e# d - while (1)
6 G! e% k4 P5 Z0 |) P! I7 N6 F - {
2 z2 _( E& h/ [0 h2 ?, ~ - /* USER CODE END WHILE */ C+ B) j# b S: b
- MX_APPE_Process();% o" d# E" W3 c/ v8 J
- 2 P4 B2 t% }; o8 F
" k, x8 F- ^) w! x% z- {- /* USER CODE BEGIN 3 */7 X! ^" j9 k: ~1 [8 j
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);) I# m7 O, g$ J; w6 d. P0 w
- }
: y: r* F5 F5 P$ `) b9 o1 x - /* USER CODE END 3 */* Z3 b, \- o& N6 K! D
- }
复制代码
5 i8 }0 j1 o" \3 B2 H在app_entry.c中添加初始化 APPD_Init()。1 U# A3 I9 G! n# Y7 _/ i/ j
- void MX_APPE_Init( void ). _6 M, k- v$ P f
- {
( i# @7 n% }) M. W1 G! r; X - System_Init( ); /**< System initialization */
3 J& Z4 g+ v' b- e - - n' j' M# W& A; z" [% H1 R
- & t& g2 i" \+ T9 ?
- SystemPower_Config(); /**< Configure the system Power Mode */
* l* ]6 m, V8 ~; n - 9 | w2 F q/ b- \1 Z S/ A
* B# ]9 v5 T8 E. `4 b! `0 L- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */* w; n4 p$ F# j* _
- , w6 G7 S" C$ A0 A
- 3 ?- _! b6 F% V, m1 b
- /* USER CODE BEGIN APPE_Init_1 */
+ B! Y$ ~1 |! @) I9 A! \ - APPD_Init();
4 ]5 j# l( c9 Y4 n- m2 s7 j5 x - /* USER CODE END APPE_Init_1 */5 C& ~; |4 {1 i) a$ Y
- appe_Tl_Init(); /* Initialize all transport layers *// X: T2 k7 v* U. o0 z
- . O6 F# c- U& ]& x& \+ V. H+ w
- . O2 f* c* ?8 V
- /**
6 l$ J$ a N3 C+ s8 |) d K" ]7 y - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
6 a+ B5 s# Z/ k6 O: J* [ - * received on the system channel before starting the Stack
3 v; B1 J$ l0 M! A: n# l& \ - * This system event is received with APPE_SysUserEvtRx()
* E3 e p4 W( N - */8 f8 F$ N7 ^+ O9 y
- /* USER CODE BEGIN APPE_Init_2 */9 R- v) Y# x' n# d* }- \8 y# s
; I* E1 U8 z, Y- u# l4 u( M' v+ E j8 n6 }4 h
- /* USER CODE END APPE_Init_2 */
; @2 F; n* X+ h7 s) R% G5 g! G - return;1 W v; x& J- M; [9 v
- }
复制代码 ?: L( b l% n- P0 q, b R
结果演示
# j9 Q5 }) f6 A6 L k# i在app_ble.c中,数组a_AdvData定义了设备名称。
% n& F8 {8 m8 {" B/ V4 p& Z4 F" R$ D/ t0 m* W, E5 J9 j
; m" m$ w: L1 T7 \* n
/ i: X1 ^: U8 z) y: _$ W3 I
将设备设置为一般可发现模式,若成功会打印如下参数。
. l7 y& p. P' ]- p. d5 h9 C
+ m/ t0 J+ Z; f! k1 z
3 @- y- L" z* G5 v" e- J+ |, B; N; _+ Y! d% @
串口打印如下所示。
/ R5 H0 v, h) q7 w& |( i
% u h) L) m; A1 f9 D8 z6 r: I
6 a( r- |- t% @6 H" @1 \; M
转载自:记帖
. P: ]+ v5 @* \& h" O! c如有侵权请联系删除
% [3 P. {1 X+ G7 M
+ g/ [" ]/ v6 x: b' I" b
! l$ u, |- q. e' @9 C4 x* S+ ^
7 d0 Q. P" U, o7 t$ M1 Q |