套件概述/ |$ f7 O+ P4 |, A. {
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
+ p5 ]& y5 o0 u/ Q9 Z+ Q
$ ~. G) }+ G$ o7 g5 g/ [! t. w {- W
5 B- m4 Q& {& g4 ~- X
! O4 C; E' A# M/ l$ g选择芯片型号
1 f" D/ I6 [9 k+ K* E+ J6 a$ g8 B" w4 _" f& I+ [! a
, {! L3 f( U |( _. ~
: Y/ W/ f3 L8 n! M配置时钟源 + e3 g3 b3 }) F. R$ f
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:, r4 T7 n Z5 N2 ~, m% H! \/ g
& A/ B+ C/ C k+ M) E
7 k" C- w9 g o5 Z1 g% c
2 e* X- V. C& \
配置时钟树
. J" ~ |( _( o& B7 S% Z
% j" ^! g1 i5 x; T) ?' n5 \# z9 b/ |
6 J+ g3 k0 ` I7 F7 x+ X k r; S' a1 D
RTC时钟配置
9 Z# o1 A. a* J0 F# p
T2 c' f' V; A+ M
& H( v, R$ v! u6 J9 ^- x, k
* p% M8 b- m+ n" k# e8 |* G1 VRFWKP时钟配置) p" o, X6 M6 B+ h- Y
) b3 u- O$ m3 X4 s
- A8 H- b) f0 ~6 m( F3 Y
4 @$ F( x4 s& a6 M
查看开启STM32_WPAN条件
3 f% x! x* p6 F0 q6 T G/ ^可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。8 B T" U# w! `+ N
8 s# W- s# ?2 ^
2 }6 w9 H8 M3 \% @+ Q- e
) |4 ?1 B f2 W# C+ ?配置HSEM
; D4 i* A' g0 T& Y! l0 S0 [& j* x硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。# B; Q4 m: A; `- ?# j7 A* B3 [
开启HSEM如下。* S1 H a5 p) ^0 E% ]! q
9 t4 r) Z- f9 i0 A4 H6 X% L* ^( d
. ^) I( B+ G7 I) j, V* z4 Z
+ Z# N+ I# q b- L ~
配置IPCC ) H# j# y2 M3 u3 x) W$ z& K
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。0 Y, i/ ~: s, L5 s' ^0 k+ w. z
开启如下所示。
3 _/ ~4 t+ r2 F. P+ d
" }& G+ M5 S# W1 u
- r' ~* N! [! r4 g) v2 F* z8 T; m8 n
* O s2 m, h& m( z配置RTC - H2 t; K H1 x3 I
& i! T& H& x8 v7 L( i
0 M9 J: A: c' i2 e, D
4 C% _9 A' O2 ]
启动RF j5 K2 u" b$ {& S. y/ O
# E9 w) i1 a7 Z3 J/ D" F
! R% {/ M% u1 [3 q8 P$ B
% S3 t2 u( m" z' r! H! R; L3 ~开启蓝牙
7 L: i9 k5 ]. c n6 a9 o8 Z# U1 F3 K5 S* A/ f7 f
$ ]# h. J1 g; [/ x) s- \2 X% l
2 ]7 e4 h9 E. c1 m5 n. }开启串口调试
5 ]: `8 c) T9 r1 _1 BCFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。( q" L$ ~! `' v9 G, D1 ~; X. X/ c
1 `$ _- v4 U, h: Z; \' D* t, o% p' r
( b) _5 k& P" }/ Y- H! T
% \; R9 M/ Z! M% p8 m( Z: U1 `CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。 W3 X, V# [1 |+ O5 `
0 z* p% a. O; X6 s) ]仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。3 d J& _$ \6 t1 ~5 |
$ e# \& @- x' c; C6 d
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。8 H. w, c# n: p! m; v9 |2 _0 c5 E! y
( Q; y4 }9 G) x3 q$ A+ v8 ?
3 i9 E# G" E) X% W
' ^1 i7 u3 z }9 T串口配置如下。
& Y$ M+ \* I4 j" G, D1 y% S5 m
5 I, X( G/ k3 x0 ~5 p4 a+ C
; V2 O5 ~" Z4 i. k! p' z
) M8 [! j5 D" f2 K! |
开启CFG_HW_USART1_ENABLED。
( l4 b4 b* k1 i: V( C" [/ v) F. V) h# D% e
! b- g+ U0 j5 P& r \' o8 [. [; S `: s$ i1 q6 U) _/ m
关闭MX_USART1_UART_Init函数的生成。
. J: o& K1 I& Y' W( e5 s* ]# @; Q8 T/ f# y5 o6 m
, }# K i3 a: D3 m7 {7 ?# ? k) I/ b4 \# }- E. t. p0 k
CFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。. N2 c. H& g; c, f ^0 @9 D2 E
) |7 {2 V* Q% \' y" Y S: G. [
当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
9 E9 O( v; Z5 h8 V
" d0 ~4 o+ j$ b; b0 D
* u( D$ [1 @5 u6 I
9 T; [3 C- P' X6 p% H开启DMA。
. S9 e7 S! Q- _, z$ F1 u+ z' m$ K, Y. P R+ G9 P8 \
* D( `$ h% n3 I! o: I& h0 y' `5 [$ @3 s
开启中断。5 u m1 E/ r9 z
* N" W, `% X+ j. {$ G1 j
- S6 ~6 @- N4 ]9 n3 |' I
9 B5 b' c: m, F# f. q
启用串口1的tx的DMA。: } ~ }$ w z" a1 e/ d& X% U7 D
8 }; Q/ Y. K" I; t/ p. |
( [0 D. v; m6 E' y7 K4 h9 E% r# s6 ~1 O8 d1 O3 d$ b. @" c
若无法开启可以重新打开BLE配置。6 k0 b: Q @1 n) H+ s
; c Q, N( R+ c$ x
1 d r* ]. n3 O1 ~, w6 S. i, M" f
! V# E: |5 U- z, ^启动串口1调试跟踪。) F1 l. ]. ?- Q6 q; Z4 S
0 F) H: ~" `& v* m& J% r) ?
& y5 [! T+ O2 O4 }( `- d1 G. m
+ }$ a) H! [6 Q/ ]; `& a. \2 h
启用应用程序中的跟踪 。) C$ p9 t P! K4 @
: d5 e- l# F7 k
, U4 U% t- t9 c4 }' _8 }) j% A$ s, E& X: Q
配置蓝牙参数 ! K9 E3 u, \) z y8 A$ X
配置为自定义模板。
1 \3 P( ^. x9 s2 l
( v3 e# u( f7 T3 y( a& c
- V' ^' |* `9 _ b+ t5 y! O6 d2 F+ T4 i
命名设备名 G) q* i, N* T$ ~8 c- D
5 A2 R1 Y8 ?* A* {4 a1 a
& p& u* i* d) d; f) Y+ @( n2 d% q: d( x; [( {/ F; V* u9 t/ A. P
配置BLE GATT
. m3 i. x3 P7 k+ f. a0 s
6 _ q+ W* F" C q# `. u- e
7 W: R7 |+ K; {4 k/ Y- g# g* I
+ S% n H! V/ U# r* l配置SVC: [* B4 E: Q$ v3 w
% u& g# E: t1 Q; U' w( M
) P* x, ]# s% l' |
7 Z0 n2 y5 R) ]1 w( }1 f1 Y设置工程信息 / ?0 h2 g$ H3 ]& h
. f3 q; Z3 {( Y
8 ~& S2 u1 x- g: w7 C) W ^) E
+ o5 D4 Q0 t; v- K" B! `工程文件设置 $ m# f! d* g( H- |1 W
( @1 L* O& o! e% b0 t* k
2 z6 ~3 c- Q3 y; L1 j# ?( n/ ?* o! T2 D
Keil工程配置 4 _3 e& m0 ?8 l
8 x* W6 `0 J1 O0 r! N3 } e
% ~2 I. B" e( o1 r T# @) `0 d& a+ c
代码配置
4 P6 @4 Q0 F t i8 {在main.c中添加如下头文件。
% K; T, W" E* X) q9 o: I9 n- /* USER CODE BEGIN Includes */
4 ^4 A: r( X+ f4 C - #include "stm32_seq.h"
3 N; O6 G- _! [$ e$ V - /* USER CODE END Includes */
复制代码 6 D9 R: I* w" K! d9 s$ |1 M* D: `
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。. f+ b' ]9 \1 N' C2 H) }" L
- /* USER CODE BEGIN WHILE */
, q5 w. P1 p* B c/ }* q; _3 l1 v5 H - while (1)( |% m; ?6 x- n1 W3 g! j
- {
1 o7 e P' u" H; d3 { - /* USER CODE END WHILE */2 \1 g8 t4 _. K. M$ h
- MX_APPE_Process();
$ [3 b+ B4 B0 [) N
1 X0 k0 W8 |, G7 q3 f- " S p! w: J( \5 h+ {# S
- /* USER CODE BEGIN 3 */0 i; b+ a7 s7 ~2 T
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);' D y: ]& k6 G
- }
% a0 M1 d& A. p& a9 ^1 C: b - /* USER CODE END 3 */
6 F- Z9 Z3 j& `: @ - }
复制代码 , l# n, v( V1 w" {. j8 ^, z. {
在app_entry.c中添加初始化 APPD_Init()。
' J0 e) v) P' l' |+ x! p2 Q- void MX_APPE_Init( void ) z% l5 \3 m3 B u a, ^, n
- {
, p. B1 \* a" F% Y: s% P - System_Init( ); /**< System initialization */
) x0 m$ X0 l h9 Z
1 R2 K+ p/ L, R% c' g
6 l5 s" `2 J g- SystemPower_Config(); /**< Configure the system Power Mode */
3 |0 _5 f: R$ \( [. t; g$ S - $ D! Z. K6 \" [0 e
- ( m1 z- m6 H6 r
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
) e9 W4 u7 H: y1 L9 n( `3 x. g& E
" x; f( d; z* t7 a$ Q* W" k
+ q2 S; r7 i1 ]- /* USER CODE BEGIN APPE_Init_1 */" k2 h; R4 c6 c D! [$ x
- APPD_Init();
0 E+ z7 l b$ Z1 \! |1 R1 u6 l - /* USER CODE END APPE_Init_1 */
6 T# _$ N1 l+ e+ m/ P+ l - appe_Tl_Init(); /* Initialize all transport layers */5 h. [9 r& k* g) B4 H
- ! Z7 k, U# V1 G4 P9 M2 @
- * O v1 k% Y3 @. \4 P. n/ x
- /**0 e3 ]9 J& V8 E1 d- I# @
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )& F( ~; J; f8 {
- * received on the system channel before starting the Stack
. B" w! c$ {" H3 B7 L - * This system event is received with APPE_SysUserEvtRx()( q3 H5 c( k+ |, Z z. n8 B
- */0 j) J) a6 g$ B" S- d) y$ a2 Y
- /* USER CODE BEGIN APPE_Init_2 */' P# d' P5 d* w/ W @) a( }1 z
! X0 V5 d/ a: g' [
/ }. W2 p* r1 ?: L$ ~ D! v' j- /* USER CODE END APPE_Init_2 */7 {6 ^0 g: m+ N/ a7 l1 H
- return;
+ _ i( d: j$ \( K - }
复制代码
1 h0 x% S& r! P! v6 a% [. T4 f结果演示
7 [* ?6 A. l' j" N/ T2 D在app_ble.c中,数组a_AdvData定义了设备名称。+ t7 B) j+ Z1 `3 J# G$ Z) B( E
- f4 C: L) ]+ [8 P7 [% r( N0 ~' }# L' V
: _$ d" _) Y3 I# v( r! |$ m4 w" P$ {' v
将设备设置为一般可发现模式,若成功会打印如下参数。
* x0 r0 Y# U" a2 R* g* y9 {; Q0 E; k- ]4 J% N1 P/ R7 X' t
$ }' I! {% L# f( V* }
9 q! Q- U! E8 n( U0 g' H [串口打印如下所示。9 p7 Z R, w/ c5 [7 \1 T5 m
0 R2 I) I9 X i+ y
& E( ~: b, ^+ |/ F+ _2 S转载自:记帖& D6 z9 g2 o9 s) X3 t
如有侵权请联系删除
, q! N) b) G+ b1 ?0 G# {. ?8 a. D* R# V6 r* \8 l' \2 A
1 h0 J; @; J% \ ]0 y# _7 o
, z2 ?3 ^- W2 d' T# b |