套件概述. e% r2 l8 h6 N% `! b: w3 a
在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。- ~+ ?/ Q0 `+ j: t& v
+ U! w6 m" x% _) {9 q
) M" T9 C K" Z2 J3 x
) N0 r/ i6 _6 x* R- A8 J7 [# R: T选择芯片型号
+ V7 A( G( J$ }4 z1 D7 R8 \1 c% q3 ?6 e
7 V. h1 v* A/ g- l% Y2 [% w% C
2 c2 w( t2 O, n
配置时钟源 4 u R- n* b' G% K' w. w
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:0 H6 R7 I' _; J8 @
% I9 ]5 Q( n- b v8 U5 x4 v+ y# S" c
9 V' f5 R! v' h# |- B
3 X( Y3 N9 Z% o; b5 d. k; \5 f7 w
配置时钟树 % A: p: U+ ?4 R8 a) N* M2 v: O
2 P# ^: T9 ?6 H/ N
- l7 Y' D _4 u( s9 q
5 o W5 a+ w* f1 b9 c/ b+ vRTC时钟配置
. M5 C8 G; R' Y) o) \3 E m/ E: v8 n4 I r
& {1 ^* u [- ^
4 a+ H7 v" k KRFWKP时钟配置+ [. G+ ^) T& W
6 K i9 D# h! A; I" O
2 a2 F: Z+ N" W( z* c* ]) v+ ~' E8 v& m0 b6 O2 p
查看开启STM32_WPAN条件
2 j9 o: H1 z5 M- p E3 x7 A可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。
% K y4 N. j) B! h% ]0 r1 \- } T" i% h0 }# b
5 B8 n. y% _1 n; y K: k8 y1 F; k7 N. N$ F3 }
配置HSEM ( i$ j+ t" ^/ R0 C
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。( h" W% q2 ]. [7 }* R4 q4 u
开启HSEM如下。- N4 ?; | H% n7 P" t- J3 `
' S, S, P5 q& P2 A4 @, C4 n/ Q
8 F! c( L) C+ O0 q2 J# Y1 v: }0 |
, X1 \' R: j7 j! q" i2 r8 s配置IPCC
$ f$ d+ y) }' d1 V% d' c4 Q通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
6 I( U4 |' }' E# V; G开启如下所示。
, d. c) j1 S" U: @! c: f3 y, J
, ?3 e0 o7 \5 d! | W- _. e& U
( p7 i9 Z9 Q+ P% j
) I T1 S% |6 h: V7 `' A配置RTC
, _3 {/ }. g4 o. \2 g: ^. I
# H/ r& c- ^+ A; r! S6 @
! S1 W } K1 L4 t% P5 B% p
! S- B4 W2 t/ _8 j) p启动RF
6 k: i4 L+ J7 s6 W& j" @2 Y
) @1 [; Y+ L: L- X g
! \* p$ _; w. R# @+ P) u; E) l% c# p4 Z/ ^9 o9 i/ i: |
开启蓝牙
4 C/ N0 U' a1 H" s0 U7 U4 H* R0 B
0 y ~# j$ t0 W Y# e( I
5 w8 y; ~5 L9 L1 {& _5 B t( H
4 K. Y D- ~ \- ^9 L/ p/ U% j& J
开启串口调试
2 e8 E* O+ i% y* t- n! u3 X% ECFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。 S$ W9 @1 Q( i; \* k
2 ^$ G- n$ j, R/ v9 C
, {4 b0 X- k: _( O* Q
7 n" g3 H4 `7 X$ e5 `
CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。2 P, \6 S' j! m
9 }7 `6 W: n* ]' e1 D7 p
仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。
2 @. h! G9 G; W- C9 z' {. o Z$ I0 V/ |8 ]" l! e3 n [
查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。. ` N* _9 F/ _+ d' Y# `+ W) x8 q& X" E
( v% r) m6 W) E. W0 b1 j" Z
7 y) [) o3 f. p$ M9 }! ^; M( E6 u; h# ~9 V. h# X. _
串口配置如下。, N1 ~" H, f) Y [; \4 Y$ l
% |8 E7 f+ V/ {
: X0 O3 @- {8 w! _ B6 ?+ L7 d2 K
& T* t$ j6 X' w! ^! @# y; O, c
开启CFG_HW_USART1_ENABLED。* j0 G+ ], R7 |/ J; V* \5 N
1 K& A# V- L% j2 \- g' Q" |
$ E% U# f' U' J* x8 `6 a1 H- R' ?; p$ o: N* Z
关闭MX_USART1_UART_Init函数的生成。
. `: k; X3 Z+ U
3 z' h+ o& X3 a ^3 g% s/ e
p& V& a5 U! I; y9 [0 o4 i7 z" W/ q$ L
CFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
7 l+ D/ s5 j+ b1 Y1 h. O( m4 B" U( r4 l* H0 `" h* e
当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
' o, ?7 K! V* I g! I1 p. U! s7 p1 x2 L7 D# K
' W1 W [/ q, w+ X( i6 L
/ T% x9 y. b& b开启DMA。
2 d2 a9 A+ p/ \: F/ k3 z7 e1 q$ A m( e% e3 N/ o
+ D: c2 ~4 u$ ~& H' x1 p# k% S
; ` C2 I V3 ^) P( k
开启中断。
& Q* d/ z( e% [( b0 Q* X- U4 X g/ s# [
( @) s: u! b; G; x) c7 _# b, g
, }! E: a" F+ H) H% G c
启用串口1的tx的DMA。$ @+ k2 K9 s* w7 E# h( r
7 D$ ?% k+ A- K- v- _0 D1 T t8 T0 y
& u" Z, ?( j; D
5 X& X+ J6 l `5 W) }( M8 Z4 g3 M! E
若无法开启可以重新打开BLE配置。
' K2 |" l+ z4 R: D9 n1 t6 a) s( O8 M1 o4 r- B% s
" M- D$ C; c* w. P/ H
6 @9 m, i! J0 o! P8 f0 P启动串口1调试跟踪。 v. m" K% x) e a& n
" L8 J( ]8 ^7 a5 s
: B) f* T' O3 O2 `% z2 \4 W7 T6 H; O7 _0 @- c4 M
启用应用程序中的跟踪 。 O- `% ?& t' E" c% z
6 f7 b/ N, @# V' D/ H
% ]4 C; ], B+ B
' b) a5 j+ A- P; q配置蓝牙参数
( i! U, m- {; F1 N; g! c配置为自定义模板。
, A. v! I. H; O# J& o! m. G0 d g( O1 A% L
. ]* M8 y) F/ U2 C/ r! K, u$ R
. O) a+ M, y# t% t' q9 L" o命名设备名+ _7 c" ]$ ~$ _9 O$ H" c! v% u
# o1 [6 C9 R, n& E3 Z
5 R- }1 X r$ I1 X
" [: o: y/ N6 u( ]8 y P配置BLE GATT
3 a6 ]! ^. ]& d- c- t& G" C8 X' e) f* h6 f* N0 i0 A4 Z
! B: N' x/ n/ q! }- f3 u: T5 C0 R( `' I# f
配置SVC
|! P0 V% [3 ~ [0 |
& ?+ ~; N f, }2 C G
* w, F' t1 J4 f, B6 o& b
" _/ i- T3 r$ \9 V设置工程信息 5 x: N$ ]) r0 v7 C! \6 Y# n! V
. d5 E9 E2 S. A7 _
~# W, z! [2 {+ D
9 R* L* v! ]2 W+ d7 m8 |工程文件设置 - P% U3 O% w7 a, W; N7 S5 U7 \
1 K# D# o9 ^+ M5 X
: h" }6 H! `, U7 g8 Y. c M* l t' y: R/ U' M
Keil工程配置 ) c' ?2 E1 K# s; y7 A; G
! ]2 h7 C n7 @
' b b3 i8 p* g$ ~$ u9 G) B6 J
7 }2 g: W q" r8 V" ]
代码配置 , q! o. W4 K9 K3 J' r4 n
在main.c中添加如下头文件。
9 q, |) M: v% e3 g: |- /* USER CODE BEGIN Includes */
1 \6 a1 v+ P0 O - #include "stm32_seq.h"
5 U+ D7 g- w+ b4 `! K; J8 C - /* USER CODE END Includes */
复制代码 7 P' H7 r2 p/ n' }5 ^
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。; r2 Q" ]2 }) Y: [
- /* USER CODE BEGIN WHILE */5 N/ q. H5 n: }+ r6 Z3 q
- while (1)) }, p) [$ Q u M
- {! I8 |6 m! m N, T/ P' w1 Q( p
- /* USER CODE END WHILE */
) c8 C r a4 i, U3 [- V" W& j1 ]- L. k( m - MX_APPE_Process();
1 @4 Q- X) W1 t& O# n& i- i. d
: x3 E2 W0 |1 v- ( Z' g. @1 V+ {1 @% P
- /* USER CODE BEGIN 3 */ Q' @9 t8 J. F0 y
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);, ?# `% |9 ?0 I: ~3 L5 @
- }
. c& s2 C9 j. c+ G3 i \0 ]+ H; A - /* USER CODE END 3 */
: e8 H& y% G( G) Y8 r9 V - }
复制代码 # b! Y# |6 E8 w+ }1 g! J
在app_entry.c中添加初始化 APPD_Init()。
" V8 d9 x5 I* _" W/ P- w/ j- void MX_APPE_Init( void )
, G( i! b; q" r9 q/ ^ - {2 }6 ~/ [) \# T
- System_Init( ); /**< System initialization *// `. d+ K7 O0 h S' A
' x2 Y# \+ p* }' r( a" R+ N
7 T& B, G3 q; @ B- SystemPower_Config(); /**< Configure the system Power Mode */
/ K2 a& Q1 l) H8 F. P8 g
' {' T a$ p+ u& z/ s" |/ ?- 5 [& R) p' U" R# p
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
) G$ l z& h$ u) y- O* B, Q
) ?. X$ B2 ]# ~( ]* u
, k6 a( V, [( P4 g- /* USER CODE BEGIN APPE_Init_1 */
& x6 j: \1 [; K$ `( O - APPD_Init();
. |( W9 `' o5 ?5 j) [% u6 l Z - /* USER CODE END APPE_Init_1 */
) ?+ _/ b7 T- w - appe_Tl_Init(); /* Initialize all transport layers */ q- L5 Y5 _5 s7 h3 j9 d& z7 v4 O, Y
- 0 I1 c1 ]8 w& m3 Z
- # o% y, l6 u2 m2 t3 P
- /**
' c. Q2 s/ R) W. Q0 V0 a9 L/ o' }7 O - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )1 G& V9 E; d& C, ~8 H5 |
- * received on the system channel before starting the Stack
8 o; A6 r9 C5 X+ j0 |. e/ H& ~ - * This system event is received with APPE_SysUserEvtRx()9 O( d, o, g9 \7 U" D+ l
- *// A( ?$ M( y0 n, w, t2 } z
- /* USER CODE BEGIN APPE_Init_2 */5 J, d- @( T# A
7 \& a& q5 u k; `# A& Y2 z4 I- 4 T3 t# u/ [$ I5 J+ Q+ y0 T
- /* USER CODE END APPE_Init_2 */
- m/ v0 P) x% Z; ~ - return;0 }( E5 |* s) H/ c5 T* a
- }
复制代码 3 b" d0 Y" X3 v1 U, {! q. n
结果演示
2 w' ^% M) y+ g在app_ble.c中,数组a_AdvData定义了设备名称。
p0 S: T/ `( _* _' x& S4 [" `+ C3 ?7 X1 q4 Y& D1 r
- W( {4 G8 o! y3 S, F0 V
2 ~0 R! E0 Y; |: o5 J# L3 e# C# s将设备设置为一般可发现模式,若成功会打印如下参数。% `: x2 }0 _& J4 u" f% `
! ~$ K# g0 m* |+ ]: j
( L+ Z; D# W7 M6 _# v9 K# D6 O5 K9 ~' u; \, K% y# p
串口打印如下所示。! i E T5 z& `7 H
- J$ p$ K/ O' w& S
% k* E' r* v3 X: G0 s, P" H! S {
转载自:记帖, \/ b3 G3 B0 x1 c
如有侵权请联系删除
# l" J' `' L: Z( Q0 L1 j0 N
% o$ y$ Q; p' C2 A" o& {' a% Q u, U1 C o
) p+ K1 E4 z* P0 }& ?% u. ?# p3 V
|