套件概述" }8 e/ A G& C0 F5 ^. M
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
3 [; I6 X0 U2 b$ U2 `8 b- J3 U; ^8 O6 {3 b/ k" ^
) n* y+ R' \+ a4 b8 H2 J
& s) {2 ]* C: r& C% V, Y
选择芯片型号 & I2 l7 m- e& m( Y; w6 S0 P
! j# C! {" q A7 y- [" D
3 l& o9 {' [" R( M1 t
0 f# g9 y% n. C) W
配置时钟源 & a: F' d6 I8 @- z# T
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
: y1 C. H0 p( g; ^+ K4 T' D5 i- f: o6 x5 P
" B {/ d7 z! d3 k0 F- ~) m# l" h* L8 C* ]9 t
配置时钟树
- D0 u& Q, U2 N0 r# ~7 F1 d+ q6 o [- G( p
, L& U, z: q4 U# i+ ]2 F! d
) E4 T5 s7 o! l. YRTC时钟配置
. [8 k( F, f2 V7 }1 R$ n8 c, B/ j; F) }
5 a- V2 c6 Y! B) p
" G8 ?0 ?! b' Y; C% s( [
RFWKP时钟配置, e5 O0 A+ Z" O# T
( ~; h( c7 O6 \& y
: A8 }2 J7 ^, ?5 i3 K% s" ^; Q5 p- I5 X3 [, m1 b! m/ E/ t
查看开启STM32_WPAN条件 + i" i/ {; q. e7 F r. Y
可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。. n( N: U; @, C5 t: Z
# o( K. _( V; A# v0 z. M3 k; b7 X
( p1 @/ Z1 U# w1 Q: y
8 S3 ]/ M5 c; `# d/ p" ~配置HSEM k2 {% O2 O0 L
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
, ^ N! u9 Q* J5 r3 P/ g开启HSEM如下。* e k$ A8 r0 q
7 t5 e0 C8 Y7 ?
! q# V9 H" d$ U9 T
) n" h; P! z% Y+ a配置IPCC ! C3 W9 ~3 a0 E! v' r: Q( e- ?
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。6 N6 n+ w% `/ t% c' J
开启如下所示。7 n8 u( e4 f( V9 p U' e
. Z- Q8 n* P2 X+ B6 B
8 h* }) |9 v6 p
+ o5 ]3 a: n( e7 O配置RTC
. h" e/ ~1 T9 P7 h2 Q3 a" u) x' d' m* E+ l
2 b; T2 V y7 N+ N) m8 ^" a% I
+ G+ U' s X4 b3 K; N3 `- j0 @启动RF 5 u% c" H$ i% j4 G; r! [
1 G1 z- ]- P/ P$ o6 z% g& A8 L
; S: d. j+ j( l/ F! C8 e/ J
- P _3 u7 Q8 R6 o5 v% f& e! a开启蓝牙 + G5 R1 G$ c& y1 f/ x
" ~* C9 e, _ U. a1 S& ~
! q+ F S! X3 i1 V% I1 B4 K( Z: H1 q. m2 |) U, r2 N8 X6 M
开启串口调试
% I4 F; F. A, aCFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。& e1 L9 i h# L
* D# F! k, R# M# |) z3 K
. K) x! L! m; d: `: Q6 _
6 I+ _( a. Q) U' w g, T: \CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。! T8 |1 {7 ?! ]: S4 e6 H, A1 G
) x0 u M9 `% X0 I- R
仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。
% |8 S' C0 I* _$ W9 [& W- ?' P2 r" D% M
0 j# p4 _' v8 Q5 P/ k查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。
7 i3 P( N2 j6 K3 G3 x% C
2 W( l- k' n: {, x
7 P9 C; f. V( T, V; B/ M+ Z, A
8 ~5 B6 b5 N. e: Q' ^串口配置如下。
% k6 J6 S2 n$ K# M) m8 S- t
& M5 D: ^- z5 ^( O( l5 _% h3 G! z
: f9 b! p% y. ^) [0 C
" J W( S9 b+ x3 R+ g开启CFG_HW_USART1_ENABLED。$ W- W: s8 X6 s% w s) [" B
# u# o0 Q# J. ^/ l. m
9 k5 z& m3 D: D; g
5 A* o$ L' {7 D1 o$ G3 M8 i关闭MX_USART1_UART_Init函数的生成。- i1 K, v: h7 Z3 }% J
+ U7 f8 j% I8 v2 o1 H [
2 h' b/ e, `2 v& ~: X; g: x9 U
5 o. g& x* C6 M2 p2 Q, |2 ?( X. c& i" hCFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
" \' D2 j/ U8 d/ ?0 B$ j
" z6 ~# S) z1 W( Q0 W当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
8 x0 l* d/ Z! n
G. U. D% P1 R! [
- q! n) E0 o( }* D/ |
. j$ @9 H: ^! C& j5 p6 e开启DMA。/ G# J" |( R2 ?% f' Q
3 l+ A: B' W L
& J5 k5 ~) s9 H- f7 o5 d! B, C( D3 w: p
开启中断。
1 W7 L- |2 @& P7 ]7 S7 m+ j- Q9 A
5 g+ d) `' d; M3 p, C# H- z& }8 [$ ]9 `' E0 H2 y0 ~ l) }: F( _
启用串口1的tx的DMA。
' i% p) x0 P( q U3 d
; P% I, J$ c2 q7 a7 s6 ~" Z
& E6 v5 N* F# `( X' H% B6 @1 o; H
6 N; }. p* {) _# C: v: Z& F
若无法开启可以重新打开BLE配置。- c2 P2 ]+ c) o1 W: b% x5 [
6 d- u4 F" C$ M$ a, ^) Z
# d& E% v W4 h, \8 ^5 [* |0 ?7 U; w7 ^% ^
启动串口1调试跟踪。6 ^" @. [; x: Y% A, l
, P# q' D; n1 D" R3 y
! Y) j2 C+ _8 y
' @ P3 f. \! c1 I& Q: ]: [6 N
启用应用程序中的跟踪 。
/ m. j0 k# c- c+ e, q& V+ r: l. j. ~2 n1 H, X
6 j# E) P/ A! `2 V' T# X# V/ u
1 N5 m- ^5 b) M5 S% w8 K# _/ G# L配置蓝牙参数
0 X, N9 F8 }9 W9 g: ?# R. [配置为自定义模板。
' P7 `( @0 f- j! H; I
# e8 X" L: S( P+ B5 J
& F/ t& F4 M. r& W6 d+ |% ^/ r4 p
命名设备名% r8 k1 \& A+ j& R, |" A4 s+ k
% M) \: e4 N9 n
5 M1 ~1 T Y# G$ k3 O
/ X- K( ^$ H) q配置BLE GATT$ q2 |8 S( V5 i; V
4 Y1 ?- f; S" s- T" X5 L* c9 z
& t/ \7 e3 _4 p% K- F
3 f; i: O. d; G. p' [/ S" ?
配置SVC. P; t! c* e# q6 G* e# ?
5 _6 R$ J% ~+ F" V, v# N h
# F! Q7 K4 R1 [/ @
. n' ^ R$ o/ Q; V# ? J; }设置工程信息
9 v" d4 F4 C* y, E* g. P2 J1 Z+ T8 K2 L
) |1 X% V+ S# t, I r, @' O2 v
' ]$ Y' f. E( y) S8 l工程文件设置 8 K9 _, H5 f, p0 ]6 B2 w0 p/ q
# J ?( Q- \7 }. ]6 r5 ]
b1 i, p( _' @3 z f u3 N0 |; ~8 B
Keil工程配置
) c4 ]. u$ `1 g9 O! I) k& Y
) \( T( y% Y/ k5 H) K
) B a0 M0 _" _+ o1 \- B5 e2 b8 X+ Q i$ Y
代码配置 & q0 o5 U" g( |( v9 o
在main.c中添加如下头文件。! O2 u$ M! a5 }3 ~3 u
- /* USER CODE BEGIN Includes */
1 u% C) c' y( e1 V3 X8 K: @% G- c - #include "stm32_seq.h"
. Q( i& d( ]. R X: s - /* USER CODE END Includes */
复制代码
- n% j/ x8 u. }6 M1 mUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。7 g+ ~' j: T0 O" Q4 ?0 @" k
- /* USER CODE BEGIN WHILE */0 p" B! c( I/ Y+ d' i; B* X; q+ I
- while (1)
( W1 z2 Q& ^7 [, U+ G o0 t. T - {' x( {9 U+ W/ ~3 d
- /* USER CODE END WHILE */
) T/ W* S- F" ~+ Y3 f - MX_APPE_Process();: }9 ^- E# E0 A2 e# w7 m
9 E( L' O+ |, O0 N! }6 U# ^ b3 |
! Q1 w# D$ _7 v) g- /* USER CODE BEGIN 3 */% L, b4 i+ ~' p) a
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);' A& }# h& N4 t2 W% X
- }
7 {, C3 e7 U6 g+ @" X! b - /* USER CODE END 3 */
; i9 z5 U7 Y! k' p - }
复制代码 % V7 n1 V4 c r( `* R
在app_entry.c中添加初始化 APPD_Init()。
. c/ @1 v, w3 v- W# l; n8 V, E2 K- void MX_APPE_Init( void )
( O+ Q3 S) H( W- T8 u - {
7 i" _! M( V7 C4 L G - System_Init( ); /**< System initialization *// Y' K& M/ Q( t2 ^% n$ K
- 8 C, `) v$ J' y2 r* ?. g$ w" T( c
2 K t1 \/ V$ t7 c9 k a5 ]- SystemPower_Config(); /**< Configure the system Power Mode */4 Q7 f$ e4 k, R! c0 o! U
' w& P. ?: f5 t( _0 N: k" |- 8 |3 m4 e0 P% q5 ^# H# ?
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */6 u+ Q- K1 B7 g6 p, J7 ?
- e1 L' Y' f! W- / X3 r& D, Y; a6 H9 |6 Z
- /* USER CODE BEGIN APPE_Init_1 */
, G5 \7 { H& d+ B& S1 | - APPD_Init();
& e4 I$ g3 N+ V$ U+ b - /* USER CODE END APPE_Init_1 */
; _* D6 R. D$ S. B/ u N - appe_Tl_Init(); /* Initialize all transport layers */# R4 R3 S8 u3 O9 g8 C
' e9 C* [7 R/ v3 j2 G) r; O$ z# l
+ f0 C! e5 z. X- /**+ D( g; U y5 ]" G: S1 t) r
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
# ?3 z- f' f0 d/ C: Q" e- U9 H - * received on the system channel before starting the Stack
/ i. D' r0 o& n - * This system event is received with APPE_SysUserEvtRx()/ G3 ]" W3 @. Z8 d1 p* P" l& |
- */8 l3 r% m. n; t: b. W' [2 m
- /* USER CODE BEGIN APPE_Init_2 */) c- z$ o+ V! P* M7 y- Q; d. }3 k2 L
- ; f2 a9 s- q# [+ m( d2 s, a
" G- | H6 w6 h0 a- /* USER CODE END APPE_Init_2 */
% A" C: Q: A: z - return;$ T9 m7 H# I7 _/ G
- }
复制代码
* C' g9 Q& T' T; P/ N" R" p5 n3 }结果演示 7 J* ^$ X! W7 {1 n. s- U
在app_ble.c中,数组a_AdvData定义了设备名称。
: J1 G/ ^' i3 q& E) ?6 C7 P. d9 b+ F$ i/ z
) p" k- v/ ?! a: \# P& s6 |# e& |
将设备设置为一般可发现模式,若成功会打印如下参数。5 F. b2 f' G9 P2 \- O+ G: w
, o0 }) c2 H y/ J( z
+ ~( s& C% k* G4 v
& ~' R, X, ^, [" m6 u串口打印如下所示。
& N4 ?5 s/ t* n2 \% j% [4 |8 }* u8 g: l5 g5 Z
1 S/ y% N7 ^1 k/ @+ r
转载自:记帖. @" ?* x' ]8 _8 \; ]8 [
如有侵权请联系删除
0 E; e$ u- k: O7 R6 ~8 w( ?+ {$ g! `3 N- k. ]5 Z
/ L/ E0 j% e/ @' i% K, R. R
8 ]- o8 _4 A7 l |