套件概述4 \2 h& A. t9 |9 L
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
( E- e5 v1 \4 ^0 W c& J6 }6 H3 @; l
. n6 \% ?4 K6 K/ R; v
, k. s3 L8 {. s3 X4 |选择芯片型号
3 d% [9 E1 V& M
" d* |/ z- }: h
' o' Q) d4 F: Y, c/ T- x8 L7 \( z5 X
5 I& ]4 R/ c7 u8 _8 K* q( o
配置时钟源 8 A2 @1 z/ h4 Y7 I/ Z; b
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:1 ~+ s2 K' g- ]$ q1 Q0 p
2 `/ M3 ]) m( k7 F5 K5 n
( W5 Y3 p4 h Q' `' @* w' X* ?2 c
- i8 ^; Z+ ?2 c* j- c1 {8 w: n配置时钟树 7 O5 M# I: p e
: n, f/ n( k8 w' J |+ z* z
* ^8 W7 G0 r* N, ]" j4 Q# ~
8 S# Z R3 ^7 z' _
RTC时钟配置 5 {1 C5 k! t8 I: O7 g0 _( ~/ ]$ f
# M; s& i8 c& H* @' ]& J3 a. `
. M* u1 U+ e: Y6 D6 b1 u1 n2 c' k
: z8 S, o& [4 s _RFWKP时钟配置# U4 d" u3 t2 D, j8 S4 ]/ Y# r
+ _6 y5 q4 a( u/ d
: B8 j1 Z- w& X. D- a9 U6 r+ o9 K8 {3 i. N
查看开启STM32_WPAN条件 + o L: S* n' C1 z% ^. X' P/ j
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
% e! ]7 F8 ?+ p6 ~2 E* W. Y1 Y) H$ m
4 E. I2 \, G' t# K
a+ ~' u$ o& ^+ w1 x0 N, h! S/ ?配置HSEM . Z6 P# {/ O" |* x! [+ a& W6 R6 i
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。; m b$ D2 s+ g( J- C) f f* K
开启HSEM如下。
2 ^& @$ L. y7 y$ {; m6 y/ _3 @- }: m: G) m$ j j
5 }9 P) h; G, z7 h6 o
o4 |: e0 a: b9 I; V- @
配置IPCC
# \9 T: _- E. r% m6 ^通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。, S; B# i- l7 F% ^! h) g; Z- m; O
开启如下所示。: _0 T- }: f) f# Z. i
* k; m/ y# ?3 j
# W' u% r9 |& r* |* \
6 e0 H: L# a$ Z配置RTC
8 U) U$ `" [+ O a2 d0 d1 W, s$ _4 L. N9 R
4 [) K; P- Q/ N( Q1 d/ h
% [6 Q+ i; C! c) B4 w
启动RF
! ]' ?; i7 L T: f) g+ N: h7 x1 s Z8 p
! a; h; D8 q2 m1 |! K
% k2 p8 O3 J: k; p) u0 w5 v/ E开启蓝牙 . k: {2 D5 o9 {
* q1 y: E1 |9 J
$ L* q; E+ E% t+ X" N
5 P8 t: R- N' }0 J' N0 l/ o开启串口调试 % r8 _6 ^# _% t) [" R
CFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。- e# H/ k' u- \1 w
2 h! ^' u% ?4 b+ @$ i8 E9 ~
* ]; e( M) C _4 o; P7 D6 C( K
3 Y$ Y3 K1 d1 l: O3 U
CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。
0 c# q m0 Y: ^
! x4 \1 B9 m2 y仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。# J3 E8 K3 N* `
/ T6 K& D& N) {$ J l$ w @
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。' g) \- \3 O B
9 G: b5 P- |+ q- H( o
5 p& W& ~; n0 P( D) G8 o
: K' p5 _* o, Y+ ^9 h
串口配置如下。
) a- V, V1 V8 Z& u9 a0 }
- E9 |! n, @+ [$ z/ F( V- i
, c/ }0 | o) q x& Y7 w# U: Z
8 V* N3 r8 @- ], _9 }5 y' o2 C9 [开启CFG_HW_USART1_ENABLED。; C; G- `4 |3 x( I' G
! E+ \- C$ G5 B8 m
8 E. f/ n O1 c$ p5 r
! [, U- P6 x( ?" J
关闭MX_USART1_UART_Init函数的生成。& L1 J# {9 D1 ^- J# ], H
/ w4 X1 n1 E7 l
F5 v# ^/ q/ W& j/ x4 ?# e* z
. ~7 c" s% e# A* u" I; c. Q- ECFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
7 B1 `% P9 Q! B( ]8 u8 |0 F# n* T: }; C2 K; T# V# J, Q5 D! d
当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。' x7 r- T, c$ i
( G; h3 Z; a3 N6 F: t
2 N' \2 @4 W" O2 H+ S& L. C0 @
& c1 z+ p, s. y" k
开启DMA。
( k1 d2 m! N4 I. s; h
2 \# _/ z& R$ E% s9 p5 a. Q4 o
; N: @0 r5 @. B2 L7 H
5 z: D0 X$ n6 c P r& S8 }9 o3 ^" ~开启中断。& ?( P$ X* B5 s x
x5 b* K; n7 O5 P G4 Q
7 U2 Z4 F! b d: {) `, h0 F$ U
+ t, B- ^6 ~8 j8 H( E( |4 \启用串口1的tx的DMA。
( \! c4 G x }' P) H! O4 @8 U: _! u5 g+ w
1 A1 _: |- D4 j* ~" ?- W- G& F" N
! M1 I/ f. \$ f- A$ k9 d
若无法开启可以重新打开BLE配置。
4 F# U4 A w$ m9 }
4 C5 P2 @ `% R9 T) h' X
) x% F! ?. H+ e" p8 q3 z0 {
9 c2 b3 C% S: }# U/ Z0 ~ D启动串口1调试跟踪。
9 _1 r, H$ j5 m3 f* L
t. z" q6 U7 U. [, W8 w, j
- J- j) x, r' g9 a
0 c7 n% _+ Z! x启用应用程序中的跟踪 。& d8 ^" D. D( j4 O/ T% J
$ Z/ ~4 Y _: g2 i
% C1 J: d0 L9 c0 w0 u. }7 Q3 {0 E9 _+ T& y
配置蓝牙参数 7 g& f7 Q7 |# K) s$ ~
配置为自定义模板。
. t+ l' b! n; n" }& {- |
1 R- t3 y7 |' L- r
2 o- z, n+ C& U, j) j- K
' W) Q3 F) s _. n! {
命名设备名
& T& o. N3 f% d% g8 G- z, I
2 [9 Y7 ^- Y$ A9 {/ x, A
2 t" a0 H6 u/ F" \+ B
/ x5 T8 ~# U& x配置BLE GATT
" b% K$ [* n9 c. j4 C: _3 `$ C) v
4 {# h$ b! l; d7 d
/ I, S; B( Q. c u9 f, @
& i) ^6 f* ], b: Q0 N4 S' {0 L配置SVC
/ e- i8 T, r5 u5 l/ P
/ I4 `' X# o& P7 B4 W3 R# K
h: ?* n* B5 q7 }3 k; E; h2 _9 J
( ~$ q G' [" A4 Y, S* P& e设置工程信息
, U7 C# |# g& ?% D+ ^7 h% S
; P; v5 }* _' ?, ?$ R( n; v. \& b, ^
! p! Y) S8 B0 K0 [5 A! z: B; e Z8 \
工程文件设置 }# f) y$ K; G$ ~& @
2 t9 t8 d0 ?/ J; s) I. B% E
# \! r' \# g4 c
6 w3 m* k& Q; |0 H/ [- A) A ^
Keil工程配置
5 }1 Q# R: w% h7 j
, Z8 s, X5 W( S0 G3 c2 z
7 S ?3 V5 M, j' @! f2 @' V; M4 k! l, I
代码配置 % Q/ l$ w* B% D& w3 l. M
在main.c中添加如下头文件。) i0 d) a& F, H1 M5 F* j/ Z: M7 c
- /* USER CODE BEGIN Includes */( h- ?5 g: }) {* L* u
- #include "stm32_seq.h"3 A, C; f) ^, e- N/ r% {
- /* USER CODE END Includes */
复制代码 3 C5 y$ l+ h) |) s/ k+ g) p$ r; l0 p
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
! H" f1 o- v# y e( j5 o) ~/ x D+ b- /* USER CODE BEGIN WHILE */
8 n2 v/ G$ N! ~4 I - while (1)
i9 ?+ _7 N7 B8 u0 m2 H# Z - {- H% y g L" |& k! D1 L
- /* USER CODE END WHILE */
, K8 [% v5 m1 |* U5 x - MX_APPE_Process();
- B2 m% x6 R( F% u' f
1 f3 `5 u2 f/ @; Q+ r! r
# X% y2 c9 j3 r8 |8 ?% w- /* USER CODE BEGIN 3 */
! r$ Z1 J5 N% r9 E5 t: t1 u6 v+ R - UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
* ~( T! f# |* Y, `% m# F - }
: C/ p) n6 }# h4 d2 ?$ l - /* USER CODE END 3 */
% F* y4 Y- P- a7 e3 A - }
复制代码 # w; |2 w% I( |
在app_entry.c中添加初始化 APPD_Init()。
) X7 P% Q2 W6 W6 j! a- void MX_APPE_Init( void )) o7 X0 t, f$ F3 p, j: k# q( \6 \. T
- {4 E5 T* }4 n* T( l2 V& ]
- System_Init( ); /**< System initialization */! O( H6 w$ P4 y* F
- ' @# r+ U+ ?4 i" B
( X8 x7 a1 g8 [; ?9 N! R5 {! _& X- SystemPower_Config(); /**< Configure the system Power Mode *// g0 i+ {" f2 I# c* ?, ?& A
& \9 y" @9 s, c4 _' Z9 W4 m7 _- + w; p1 H' t4 K$ }1 D
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
. a$ e z& a" O- v% Z1 v
" e4 A9 i: X4 v- V- 1 {( R/ S$ ^8 L+ I1 r
- /* USER CODE BEGIN APPE_Init_1 */
0 |' Z( d/ h6 H* }3 T - APPD_Init();8 E) M4 U, X' C4 U
- /* USER CODE END APPE_Init_1 */% y( ?( C* v( G6 [+ |
- appe_Tl_Init(); /* Initialize all transport layers */
2 W$ o5 z2 f, Y* G( E( F3 o2 G2 u/ v
& L: O$ j9 @9 j& f& l- 2 i* U8 H+ C. Q5 c. S* q
- /**
' Z! K5 T* z* b! s. s/ | - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
. @6 K+ |) g% m( S8 b9 V% D! ] - * received on the system channel before starting the Stack# W/ }& t; `3 W6 H( }
- * This system event is received with APPE_SysUserEvtRx()
" Q5 A! I1 Q @8 q - */
, i. U0 m# ]" G* C - /* USER CODE BEGIN APPE_Init_2 */6 F" v# t% R% j" K/ a& C1 x. L
6 I+ I; R5 r4 E! d
6 `8 o0 ~; c/ r* @- /* USER CODE END APPE_Init_2 */
6 X/ U: N! w# o' D0 r - return;
( V+ @# |0 q/ J2 B/ c9 m - }
复制代码
. i" \8 h9 I1 L7 o4 p- s结果演示 & g; @7 [3 i2 v, D4 c5 |$ n9 k- k
在app_ble.c中,数组a_AdvData定义了设备名称。4 y: z/ k# ^4 a
3 y( b: d/ @6 P
L. X7 L8 x2 y5 g5 N k
% H' v5 _$ w* I2 r将设备设置为一般可发现模式,若成功会打印如下参数。8 o# {% M; a* q. v
" L6 G5 B4 Z2 v# j0 K# O3 r
8 K; W d* y, W' m7 E4 d, U) B- T
8 k* j7 q" X! X
串口打印如下所示。
# i( |% M) d/ ]" D
) B$ h$ J9 h* ]4 A9 w
5 Y$ u; @+ T. G转载自:记帖' B* a' W" I9 b z+ Z
如有侵权请联系删除2 r( L' u2 w: E" {
@9 ~+ D+ V7 ? g. @
$ K3 @9 a& r9 s: j( B+ T+ \% [/ R- K6 |
|