套件概述, _- \* Q6 B9 Y( v
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。4 g$ e- H' S; A- S" R
8 V1 Q2 K( e/ m4 I
- `' Y8 M. s( d5 O
/ t; w& _6 d7 S2 K5 V选择芯片型号
# l( u- h8 w( n7 `1 {# |: d2 O. R
/ q T3 S/ V& | A, h
9 _0 Y' W3 G6 y5 G$ f配置时钟源 E+ G, `( A8 C2 D
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
% D6 f' I1 V0 W2 p% D7 [9 R8 y: v3 B& v
: c: t; [' t- L( K+ x: o
3 F, I- h7 x; K8 \4 a, {; W
配置时钟树
4 |/ x8 f% W! e: k' Y2 s; H. X: h
" o0 J6 K/ l2 j0 d, w6 R# x
8 O" B9 y8 q1 a. R
! E$ M5 W, D. R+ @9 c
RTC时钟配置
" {% ]- A4 U5 Q+ O; l3 g( S; _& g4 W7 o0 I( |+ l4 d. N* {& M5 T
9 |. @0 S8 E& |5 C2 ~3 V& F5 C% w7 T9 u$ \% @$ s: ^
RFWKP时钟配置
# c9 w m$ \' h8 S' K( Q: ~3 F. z, B5 C% O' h
9 u9 D4 L$ C8 u c& N: P [ t/ k
查看开启STM32_WPAN条件 & V) ?" @( w I* T% a& h
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。$ W. U. Y) e! N: d
& R% x; T$ [) m' O% o7 c7 i k: E
+ p0 n# f2 Z1 U* q
{- F1 K7 b/ h2 D% S配置HSEM / j. Q& d9 J, z# T
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。1 L) |7 n% `5 u; ?, j9 a" x
开启HSEM如下。
3 s( p+ P5 e* D$ B
( x& N8 B* J: h9 u" d
, g# k3 B' E7 c
) N- L5 ^ _1 n5 A& \配置IPCC
2 d+ r: ~+ I' g4 U/ [! C通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
# s; n2 G* p) l* @0 U" T$ G( S. K7 X开启如下所示。
/ F+ ]: S. U& _' b
/ H6 P$ C, O3 \, a+ _
: C- k; j4 y" ^2 u" Z4 _
7 J* n/ S7 L! F o5 q/ h配置RTC + c; f- G! h# x4 C F+ J6 T3 H
/ q/ h9 I0 C$ V. V5 c, F
2 C' C+ I2 h/ s( L+ z
4 O/ @ w* | x2 v; A- R3 g& {启动RF 9 a2 G2 M5 h- v) t1 a3 F
& ^5 X6 ~7 ]3 q, A* W
0 H5 R$ }4 T$ e @6 y; @9 T
5 I9 G- K& b6 s2 x% x5 C
开启蓝牙
" U/ e! Y U3 C7 g9 k3 i0 P4 F5 W+ ~$ v* {$ H
7 f% }" s6 [7 N$ h- J
6 ]' m4 \& _) q) N9 `8 O开启串口调试
( n8 \7 a% K m; |$ R) P) Y9 eCFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。
2 N6 y% O* M% v8 U
- H' ^0 Q2 D C7 W% z
4 x- M- f y. a' j+ X( L
# q( x$ V; K' \% k6 t u$ v2 k UCFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。
9 n4 a: @" j1 N* ?' u& h! O
& K0 z, j) |) i; M/ `7 [1 b7 P仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。7 r0 N4 w: ?" L% a0 U, g
- b4 I8 y, ~) Q, u& h# i
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。
* I# r" |1 w$ n9 \' u
3 k4 E+ G& A, o3 R* ^, J7 n
" S% `. k1 u* ~' l' u. J0 L: }
2 `' K9 {: g6 p g7 P3 J! R0 [$ n* |" c串口配置如下。
( v* X2 }$ U7 U3 u$ d8 n" D4 o0 n# j2 z+ L& E3 A
: X+ ]* E1 E) I6 [
9 Y, T- E9 E# O4 U6 S' W* d, B2 |
开启CFG_HW_USART1_ENABLED。7 ?3 e5 J; v' G5 m
' w- _, Q; w& t9 o
) G. G8 y' T3 A" J2 G
9 W: l. C% j% F& B8 _! T( ~关闭MX_USART1_UART_Init函数的生成。6 J9 g: h' u& x/ @# s
; M1 v" G6 H1 |5 u- ~, Q5 A5 u/ q
0 R. d1 ]7 [6 [9 R, ?2 j
6 s' C- z0 _) N: u8 L* ~* F* P eCFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。/ @9 o: C& V" w1 e5 q
1 N8 K& ^+ \7 x- l$ g
当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
: ^9 _! G+ f! Z7 R9 x! X9 J$ W( h/ M- I+ D4 U @8 y/ b
5 s$ Y* |+ ]+ \# k0 h5 |: x" b9 ]2 V/ d: o
开启DMA。0 _& ~; S- r& ~9 P8 G9 z! F1 Z- y
& ?$ m; \& T# N; \7 i, ?
; w$ n1 [/ e9 r- x% E, h
2 S: _/ h" I7 u( J开启中断。
( S% |5 |+ z& B0 c. n, L* _5 [8 ^1 k* w, T0 F4 \. T) T
, c& _2 L) c N: s) f7 f$ L
* h% v, E% V% M, V
启用串口1的tx的DMA。* {: h5 o9 j: q2 v9 g5 v! ]4 W8 M
# [* t. T# p: @
- \5 Z" @. G9 d8 b
7 o! l3 ?, l5 w, @2 y; n3 q若无法开启可以重新打开BLE配置。
, f. K; s, u- q4 C, n4 Y% v, D. K
: |- y @: x, W2 d
; Q$ K' M! \9 Y+ J3 @
$ h! X8 R3 \5 a0 x+ T7 s+ [启动串口1调试跟踪。
: \% E' W) _/ t/ F* _; D* A3 t9 v. u" |: C* A% g0 z
# U7 O6 I9 k) Z2 n
. I8 ]: o9 J. ?+ @% m- P
启用应用程序中的跟踪 。
% Z- `$ R% a0 u+ m. \( g6 r8 v) V. `& L0 l% A/ _
6 d+ S5 s* S. `' k! y/ l3 I: o# T' ] z9 f C# |
配置蓝牙参数 & N0 w) K" q: t1 m1 e: b
配置为自定义模板。0 z' y' |' C: q" [( G
* H; L5 {, h( r Z
* b# @$ z. L. ]: s" I5 D- d5 R$ j+ g$ v* T6 |
命名设备名+ {* w/ t; Q' w* k+ Q1 x* U# `
! v- j% k" z# G4 W6 r' y
6 f4 P' @1 G: B1 `( Q2 n# K/ Z; V) y! P
& n& x. G9 @% H( s* k配置BLE GATT& n# j7 e) O7 E! o: t
2 y# p) `: n) \$ I* \2 z }% t6 u7 _
c& R/ E* f' d5 x& R
3 J- [) r( G' R( e3 V+ `; r配置SVC
- K8 k6 k6 e2 A0 L. U: n7 G, T& s/ v4 H* d
8 q e2 v, U8 ~
" b, q: J6 _$ J: x& L8 X0 c设置工程信息 $ h: D" O! u1 S7 R" r
0 Q0 { s( y1 M) j; N$ e
" ]! {* h. R( _+ B
) i0 v$ W5 T# m" l+ [工程文件设置
1 ^7 m) ?5 V. u% W" c/ y, M: U' [ b7 D
9 Z% N6 p/ r: F+ T/ {$ g$ W7 }; B4 x0 `% l* c7 M8 `. A# e3 W% t
Keil工程配置
3 ]' _) F4 \, y0 [; b1 u
6 I, M: ?- ~; O6 H9 v8 N/ F! w
* b0 e2 ?* l( j/ K, t9 G H
& @2 A! l1 s5 d5 L7 y+ Z. F7 u
代码配置 ) {1 L; s8 V8 X9 y2 X
在main.c中添加如下头文件。
8 f7 v2 m9 f$ O$ E H8 m- /* USER CODE BEGIN Includes */5 G) I7 y$ U2 I; g
- #include "stm32_seq.h": M1 Y4 J$ a, d, h$ k
- /* USER CODE END Includes */
复制代码
, w# J! U6 g0 {$ HUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。$ @- ~; |0 Z0 p4 D5 V* U& e
- /* USER CODE BEGIN WHILE */$ j0 L6 ]+ R, i4 ?! U' c& Q' Z3 w
- while (1)
" N) G A. ~) x; R - {2 J7 M7 q" U4 h0 s. Y
- /* USER CODE END WHILE */+ p/ ?# }# B; G
- MX_APPE_Process();
1 X, d& G* e* A# I; r - - `0 n7 \6 T# f( h
1 [# Z" s7 c: p$ q- /* USER CODE BEGIN 3 */* Z* c7 i* s9 e5 V: B9 A1 u
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);2 ~& D% Y. `1 N+ p* |
- }" n/ L4 x3 z. t% p- g& S
- /* USER CODE END 3 */& B+ b+ D; T e9 K! a
- }
复制代码
: t9 X& d" @" p# D: a在app_entry.c中添加初始化 APPD_Init()。
0 [ a5 j8 p0 v7 m7 ~) x n; l- void MX_APPE_Init( void )( i; a: V& Z: g% C3 b6 i; Q) g
- {# B* f% s3 C2 I7 T6 c
- System_Init( ); /**< System initialization */7 w, f! p/ p8 _
- 4 C6 f* Z' {, r
- 1 h7 {6 V! _" y
- SystemPower_Config(); /**< Configure the system Power Mode */ z: {4 U9 h7 L5 ]3 C% y. s
- % w( j( `/ [6 }7 n
- 4 P/ A/ W! ^, ^7 ]! p: \
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
- ^( _/ l- _7 U+ B$ t
+ U" |+ S8 F0 t0 h+ v# ]# ?& I$ u- 8 B; } ?% U: `
- /* USER CODE BEGIN APPE_Init_1 */7 ]% n$ z/ f% @4 B) h9 t/ m/ @( L
- APPD_Init();
. F) e" b+ f6 V+ T$ q - /* USER CODE END APPE_Init_1 */' h+ C, S5 W( d+ \( i# l! ^
- appe_Tl_Init(); /* Initialize all transport layers */5 y5 m0 p+ n0 Z' s& D
- " |2 C6 r: W0 H4 k Z
; T0 `2 c: T# e9 L- n! D* g- /**
f: }9 a" }( G) w - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )9 t$ X: E) P7 {7 K' E- O/ @! o
- * received on the system channel before starting the Stack
5 z, V% f$ ^ h+ t+ s7 x - * This system event is received with APPE_SysUserEvtRx()- x, ^, [( T& P' s
- */. c" Z* F; a6 g! t k1 p! e# t
- /* USER CODE BEGIN APPE_Init_2 */' [( e E- X7 s1 c
- ! p' D/ o# ?5 `; k
/ O% o- {) M7 c9 n+ ~- /* USER CODE END APPE_Init_2 */
7 Z1 Q2 J9 q' p6 z' h! o$ d* l - return;, b" W! q ~3 x6 z2 d
- }
复制代码
! C+ H0 ~# l, h' j3 }! `; {结果演示
7 `3 q7 y# @4 K( l在app_ble.c中,数组a_AdvData定义了设备名称。
2 q% O. ]0 `: x9 O8 H
8 k) M5 Q3 u* i7 y
& |- q$ y. U" F8 ]0 J F/ F
/ `- C* c/ \- t0 q5 w+ {将设备设置为一般可发现模式,若成功会打印如下参数。0 q5 }% @7 B! i$ f+ K; k d2 K
0 Q d8 F9 n7 w2 s3 Y
" A% K: ~; H: k& n2 a( G) m, b: [$ f& [1 Q Y$ M) k6 l6 o
串口打印如下所示。& o+ H4 A, J, v4 N: j
) U1 D' N. }/ ^) s0 j2 }8 W
9 @" ]% H3 ~/ I+ \' t, R1 f
转载自:记帖5 {/ `* F& z3 W r5 j5 ^! n! u8 w
如有侵权请联系删除
: V$ q0 `/ V7 B
" k& [7 i& O! F4 |5 C7 B* S2 \1 Y/ B6 s- L
8 s/ s7 n/ u. F' h" n |