套件概述
; a# p) g7 ]* ?+ Q在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
9 x& s/ R8 m3 Q, M$ z! m6 y2 H
! U& ~3 b2 ^* X; K
/ _8 E% @8 Q7 N# |
$ @6 ~ |6 Q& E' X' A3 |选择芯片型号 7 X3 i6 y, ~1 A& b# o$ p1 S
! j( ?1 v+ F. x: j5 f
% S+ a% y: I A; f9 x" q* k2 A+ j$ G5 B6 d; b6 b
配置时钟源
: o. W$ d7 b* C% l! g3 Z! f# [% SHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:. |& v3 h: g5 o7 O3 \2 T
0 j. Z; o& `( n$ [
: {' S- d$ T2 e/ b
( ~8 h, `& w! K* y1 r/ {1 R% H配置时钟树
3 p" V" t" h9 v3 Q, w0 _8 [' E( C
" c# |8 [' s+ J% m, t4 ^
% z% E& e: L i0 _5 f0 o2 v( s) m9 Q
RTC时钟配置 # u: W' M7 x2 `7 Z9 T
) p5 P. D7 i* D# g
! i3 W/ t5 ^* W; Q! C" F/ w
! a+ c( E: | X$ G8 ?8 ]. z7 g. [# J3 o
RFWKP时钟配置" _" D6 n2 c2 k+ d
F: V. N2 } M2 {2 g6 j% [
$ `# P9 r' Z' {4 p0 U
# @* M1 q {+ ~5 a查看开启STM32_WPAN条件
! r6 M: l# O h# C, z' ^' G4 i可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。* M4 z! Q2 L7 L: R3 u, e
* z8 O2 ~+ H+ v" Q! y2 p
0 B% G9 o4 M: q8 I8 Y, J
, l0 j" P; ~' Y5 c/ k
配置HSEM / I% c' [5 ]/ W9 O
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。: g3 V2 M0 k3 a- b9 }
开启HSEM如下。5 c& {8 K0 w/ ^+ u
: i7 k' G) o/ K2 u' ~; N* l
* V2 N# y/ h+ g+ |, d, ~' l2 H5 g: w* Q! \
配置IPCC 7 D% F& h# O: {! H3 o
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。
/ w2 B1 J; y" `* g5 Y* E$ f开启如下所示。. y9 s1 t" |: c* \; F
. F8 W' S( ?6 O- m6 ^
- X0 {9 n# ~( W! h: r. b% a7 P U7 N4 i9 Z5 G& g! k( \2 x$ Z
配置RTC . ?+ U& q/ h$ x3 y) Z
8 d" e' m5 Y3 q
) x' @: {: F$ k) p- C6 T3 v" e a0 }: _8 M
启动RF ( s$ `' P7 _2 Z& W
3 l0 E9 x, |- `* T6 U7 K' i) P) {
. ?( x/ B2 v: ?' I$ a6 A( f# Z& x8 w
开启蓝牙
, b, }4 i0 R/ r& y
7 x, ~+ ^# |4 h" k
. a6 D% o# `& V+ C, E; N
+ Y3 K0 c& K" _# L开启串口调试 + O9 s0 f# \2 g! F" Z {1 {/ M; [
CFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。$ D% k; l. H* ]' q: C/ V6 B" |
( {$ d! v( M f6 n( E) W
5 F. O3 F3 Q: V! k1 b) L
+ e7 C! E7 D; i4 _
CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。# J I1 N' A% y$ v. b2 P& @! D. v
& F# z+ y; {' r+ H: Q; W) V4 n/ `仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。5 [- N1 h# e8 ~; _9 A; y. z
$ N& q1 W% T ~查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。
- c) g% z: _' N. c% ?* J$ T( t' I2 t# E; Q( o
" P2 p; r. V$ \. j* v8 ^
# h- x1 I/ P) O6 j
串口配置如下。
# `0 A/ n) w& [: `" `. R& x2 h" t$ p) @
2 E V# i* R% f2 T
6 P( I! \& E. J( K# \2 z9 c' }+ X- Y5 d: V# V! V1 x2 v4 Z
开启CFG_HW_USART1_ENABLED。+ U4 A; k k% P
" M: r5 t2 H, b* { P4 ~) {
$ F2 R8 X' a7 k& k/ s8 K
6 a; |% l1 M, l: L关闭MX_USART1_UART_Init函数的生成。6 `! L+ P" \# r h
$ d6 s( K6 e; ]! E% H/ O: H) S" y0 H
" ^" u+ l: |& X+ ] d4 d
n a" \, A- I: Q7 X* oCFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。+ |3 H% M4 o/ T- h7 d
4 G/ E C+ s) v$ j: g当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
- g' D) ~4 S: S3 I1 z( B7 u8 @* ]; Z$ f7 D& {& z- x
i" r' W' k: E M5 T9 r
/ h+ Y/ n, ]1 O/ V r, P/ S1 B" f; k开启DMA。+ f6 e! b R' p7 L% P
- {% o. ~( w( {% r
' s! p1 j+ f% [9 o7 N
( c" c, F- s, I/ z! j8 x5 ~开启中断。) L; E9 N- z7 O. P( z# h
3 Z1 J# @5 {- }+ o
z6 T" u! k# v: S/ G
5 l- m$ X$ c2 G
启用串口1的tx的DMA。. |4 ?3 e3 N3 Y
% ^- h6 p( v! D A! J2 G# T
4 D& r( M( }* i4 p
( R: p: f1 p. a若无法开启可以重新打开BLE配置。0 U7 }; c, n, v' \% A" x& R2 c
; O" T# b0 u) S: d. Z
3 x/ n- u5 q: I" c/ @4 u( z* r! k# a& `9 c
启动串口1调试跟踪。! X% d' D' V$ @* r2 B, ?& ^$ K% K
# c! \0 X6 Z! q3 G# N
1 {( Y9 x9 I- H& ]; C4 t6 @" l
$ I* z9 O' V M! P, R7 K启用应用程序中的跟踪 。2 l6 \3 u7 x1 D. L$ {
) K' [) ]0 M; Z3 b l( v0 B( I
0 G l2 v1 }; Q; @/ |- q2 O' @
$ N1 S+ D6 {' z+ ]
配置蓝牙参数
" G* Z3 r% w5 F3 |配置为自定义模板。
. M Q" l4 p' d I5 P& v
4 v% P; W9 q2 D) j0 Z, j
" P3 @$ T2 k& k* r4 _" t* `% ]6 ]
0 Y1 @+ r) Z' ?8 I/ U$ }+ V, d命名设备名: b' n D, n* P: j! p
8 ?; Z9 K! L) |6 a
3 N* s, s3 U& s# S. p+ P# o6 Q
' o9 @0 r5 K1 r5 t6 S3 `2 {配置BLE GATT4 f8 x) s+ n! h) e
" T/ n; a% D, j8 C
$ ?, R' ~+ ^0 e% r# K& b( Y9 S) q' n/ [% t( u6 Q7 a
配置SVC
# S5 i" U+ ^) _2 t7 j3 o5 p
5 e- q# |5 u9 Y3 D9 t: N+ t
) R0 Q: Z s* l0 @) `
& }3 L3 {9 Y! v0 v; |8 R# V; b8 }设置工程信息
8 c' h6 r* w1 n* W
/ |& ^0 A3 E; [4 X& m
B/ \( ^+ x" b
% L; N# C" B# a+ a
工程文件设置 ) [, c; B; [: y# K* Y. N+ g) `
9 \& r5 ?1 D0 q: V1 z
: V' _3 [( H; U4 \8 m Y
1 y( `; E+ B4 I6 VKeil工程配置
( z' H1 a, u6 w$ Q% g# J, G5 H7 p+ q: ^" x8 u# `) t
/ F2 _: ?; h* F: W8 |/ d" C) i- A# ^3 @8 _! P8 c
代码配置 + p2 _, G7 ^; w. v8 A S/ d) I
在main.c中添加如下头文件。# \9 A. `3 d3 E, X4 ?
- /* USER CODE BEGIN Includes */
. @3 b+ r( M' R* g - #include "stm32_seq.h"+ n# k9 e4 V8 ]0 K1 `9 k7 o& A
- /* USER CODE END Includes */
复制代码 5 N Q* G- p4 V0 X- L
UTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
7 X4 C9 o' ^$ F5 n- /* USER CODE BEGIN WHILE */+ W+ g7 r2 K8 U3 P. H
- while (1)
, I( J# c4 T; s6 o& g - {( K: b) h0 ]0 M
- /* USER CODE END WHILE *// s. g* p3 [' j1 [! f0 m
- MX_APPE_Process();
( w3 P3 x/ H- B+ _ - 6 X" q/ _1 G" ~- s# g6 g
- 1 {% o; T) F; `9 N! @
- /* USER CODE BEGIN 3 */$ [2 k c, P& l, Y; Q
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);" T, }* z1 O7 ^/ }
- }
- t# h% R# k( h - /* USER CODE END 3 */
3 e) ~- p) @9 s$ a, z# t - }
复制代码 * x* Z2 r% U+ k6 ~: G) S
在app_entry.c中添加初始化 APPD_Init()。2 E" y& J- G+ V+ O' T" d
- void MX_APPE_Init( void )8 P1 N5 {' |( v( B9 K
- {* ~* j/ |6 u0 _! f( c0 _' @' Y
- System_Init( ); /**< System initialization */+ K( C9 ?3 B2 [1 J! s" I0 g& Q0 }
6 ]1 p0 `( k' |6 R5 ^: U, U
# f9 \, w$ x* V. J, p& P- SystemPower_Config(); /**< Configure the system Power Mode */$ u- f ?: k5 \! Y5 d! M2 M8 ?
- 1 ]/ f- F6 O: I9 h- s
" ?: a- y" c. z$ J9 @7 U- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */, y7 l. y K% T
- 3 p$ x- G) e" o: b+ Z% [
- # y7 U, c5 x5 Y% y; u7 ]
- /* USER CODE BEGIN APPE_Init_1 */
) \9 x1 K. i7 [$ N i5 h - APPD_Init();
* J+ n2 z/ D# d& |3 _; ~) e& K - /* USER CODE END APPE_Init_1 */5 D$ E6 F( Z& f' c9 N
- appe_Tl_Init(); /* Initialize all transport layers */
$ k) I T, Q7 | - / u2 ?: Q: Z c1 p) I
- I# r2 M* y; c1 M; g5 A2 O% E$ x- /**
1 d. u. p& U, {& t3 ?8 X - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
4 m) P! s7 a1 e9 s9 h2 [% g - * received on the system channel before starting the Stack9 W0 F( P; p6 a7 u
- * This system event is received with APPE_SysUserEvtRx()0 ~# v. Y7 [" S, [
- */+ P# v9 c' P( E d( j2 z( {( I N
- /* USER CODE BEGIN APPE_Init_2 */
% h" u/ i; X2 ?* M
/ R" f( D- ]: W" S9 L
" i5 w' a$ i7 R# p1 Y- /* USER CODE END APPE_Init_2 */; U% g( Q f/ w
- return;7 ~. J+ \) _' K' _3 r# T
- }
复制代码 & n# k4 f( f% v; S
结果演示 3 r+ R5 V- v6 `. ^0 @' u. H, n7 `; }
在app_ble.c中,数组a_AdvData定义了设备名称。* m! [) I# O, D6 |$ ^
( Y6 q# v7 B( \ o
& W8 P4 Z2 X9 d V* ~. f) a y" Q# f7 X. A% S. V3 I6 Y* v1 _
将设备设置为一般可发现模式,若成功会打印如下参数。4 R8 @3 Z/ l: d
9 e2 B$ ~3 t( r" O5 R, t' N' d) \
5 J; w$ T9 @0 t" P( A
6 q3 v2 G. v2 G2 k4 P2 a串口打印如下所示。& L9 S5 B: `1 J8 `' y) s
, |! b8 o9 _+ A0 ^
8 i8 _% ?$ p! C9 Z, x) d: v% B转载自:记帖
3 } u- H3 i C. v6 D) u- A如有侵权请联系删除& {1 n! I2 L; {- i( D
5 s, p+ b3 P) Q" |+ y: x# z
* y, T0 C5 r3 b" S* O+ |: c
; z% @6 S. K/ T6 b; u( W |