套件概述
# q1 y6 V9 f& P# R( c: a5 }9 g+ M1 v在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。) J/ c* ]0 b) A
, t8 O: z3 }# {0 U+ e3 L
, y& K4 z+ t. \! L, ]2 F
+ n: @+ ^ r; a N: o" _选择芯片型号 1 U2 q$ Z* C ?+ q
) C, R! g9 X: z& a a/ H5 o
+ N, h( n: t, x& R* |
" W* M9 h! C) R配置时钟源 6 F" Z9 J; X! P& w8 | T% D% y
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:1 r# Y% Y' v& e$ Z% w. j, n
% ^% ]- V! z2 R; F
9 H6 O, X. M j* t1 {5 t7 H7 E2 i* L7 W
配置时钟树 8 b+ E& Q0 I3 ^: b- Z
o4 [! M3 s9 R2 B
* `( U( {7 `& E' P& e( v/ H
! @8 s4 @" z7 E0 f3 c" C; [RTC时钟配置 # g6 H) h" ]) M2 h0 g0 ?8 o
. _5 Q0 J& t/ Z. z ~2 ^
! |$ M: Q8 P+ h6 ?+ {
2 F( y/ h/ E2 c* @ W; D- @( \RFWKP时钟配置* m p$ P- L. G5 Q7 t' E
# Y- n- M% y3 h1 e. [! m
v- e6 M; [/ M$ ]# i% ?
/ h0 q+ t" S7 ~/ t4 _' J% ]; j查看开启STM32_WPAN条件
+ O* p( m- x; ~' z1 r: p可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。5 u" N) ?! w( M( D* O# z4 E* \7 y+ S
# L# c# _ j J( {8 Q
) }0 J4 d6 B( |0 U- C% y
" ]& u4 q( n& Q% I% T9 [7 L
配置HSEM
) c2 u, ^" A4 w F! b) [, A r) Q硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。
( T5 g' V4 p+ ?, W5 M7 T2 W% j开启HSEM如下。( h! g, @) ?! ~" b- m9 O! X; o" U
1 t* k, z2 V# r" `
; w$ N1 W# X& Z/ F: ^ W {& }
% f: }. p3 C# P1 Y' z& G9 `/ o配置IPCC + y7 a; b Y$ }1 C- @/ o. D, n
通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。% q3 R2 ]0 s* A* i' q( }
开启如下所示。: n8 N S; B) o, l- y
9 I3 q# @# [& O
$ p7 h1 ?' r8 j" |
. s: F; Z- j" a配置RTC
$ G; r9 U1 R( w+ A( l. |4 i7 G* g' J+ h- |0 o& X
( k9 h( s8 z: u8 E8 c, o% R' ]6 ]3 k& O* z6 c
启动RF
6 n# N* D6 l0 }; R" c8 r8 d( x" K9 L+ b( k2 o/ W0 e
/ t9 U, o3 q4 ^) i( |# Q6 e1 Z! v
9 o0 y+ w2 }" ? |* u4 X5 y开启蓝牙
9 C5 o% z$ g% `- g8 ?6 X* J/ @* R" N* C4 Q9 U2 `- P; I
6 V) W' A& l& O1 B! A$ p( ~4 G/ y
7 y2 ~. L1 c; Q; ^" E
开启串口调试
% }( U8 {! T& q5 ~CFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。
% @! d$ o7 |0 m: H) z
, W' ?; \+ v0 y+ ~( w, h
0 s% ~" u ?! _
+ A- e) h# G9 U' |& }3 A# ?& M
CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。
( f# V0 C; k* |' K
& W% h Y- H1 ~% w# s/ {( {仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。
* J. d) t) e. E! I. H$ \4 t
7 S: z6 \. @( A% G查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。7 s& |* b3 K6 r k. `
; z* j; N- E( |6 l" ]
9 N' L! z4 u3 A7 h+ Q; u2 D
; K" ^! S( D" d0 l1 T" O: X U( d串口配置如下。
: P' N% e$ x& y S2 j5 V6 P& N3 i1 Q" e/ }
% J( s) s4 R" Y3 ^8 O
& b x" g0 e: m- S1 g开启CFG_HW_USART1_ENABLED。
) {( g- n6 h) k6 w# [2 E+ S k+ P
1 Q* k( l% y4 X x
4 ?9 ~: R% k# P3 k L$ f9 ]) z! Z8 P$ }# M4 H
关闭MX_USART1_UART_Init函数的生成。
, b" G& U% T! z7 a' w+ l, m
. ]6 o7 f* H+ g: T4 h
9 B4 T2 O! x6 ^$ V1 ^
" [* U& F6 z- S
CFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
8 v! c9 o+ L/ R& a: E
+ ^0 l; F7 v* A& {1 K9 F) m# H当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。( r. u. E6 q; s3 y0 @3 w
0 P4 r* L( H8 Q" h4 g- J
1 y2 q( \! \( \& S$ \. K* q' G. h2 P C t: R. \) L, c ~6 ]* B
开启DMA。7 _2 z1 C" V1 ~" w3 B9 u( {4 |
R }8 s) T$ w
' p% G8 r! s, u6 N0 b
8 F z+ w: v+ A: z0 S: Q开启中断。
3 N3 |9 ]8 h2 i
: c. D0 I6 G7 { t
: |* z( l$ ~) ]" B% j3 n
& B2 [6 N6 m" [7 O, h2 i2 R9 a启用串口1的tx的DMA。! l j3 N# J1 E0 J
$ q6 j8 T7 z! ]% B( U: e; O
. a" y% u- p7 l* D
. S, R w0 R- t& d/ A% M若无法开启可以重新打开BLE配置。3 F ?5 K- m1 L: p* n) Q. P
A$ D2 I! J2 A. T, V
1 n8 A9 I8 F( u Q0 z" B
* H) A+ j9 }, e8 j3 ~, H启动串口1调试跟踪。! _' U/ N7 L! Y7 E, E* o. L
) X, @( F0 r( S
; a8 d, G" h. q1 x. x; m
3 f6 w% G2 w7 W0 e' h1 n启用应用程序中的跟踪 。
4 Z8 @+ X' ]/ \! R' V1 @
2 e0 _; Y6 \* B- q1 C/ A
0 t! E5 g8 w! g6 R$ h4 ~
! f$ q. _0 x8 W7 A
配置蓝牙参数 - D$ f5 }( v$ d$ h: |
配置为自定义模板。
H) D# i3 Q1 f! z; h
2 v2 n- Q9 `, G0 E, `% l
$ S+ S# t5 r3 Q4 F. A( [
' |7 D( x/ F/ X8 y* O
命名设备名
0 _ J9 ~- j9 K b |) [4 [1 R- | i0 F" c: S7 B2 o
. j+ e+ Z0 a* \- X
" ?; i: `* d7 Q0 c( Q4 o配置BLE GATT0 s6 X: ^! |# h! g$ r M" j9 F
, M' M- g) F6 F: S# G
; _0 o; H1 C) v. `9 C" K0 o+ ?2 ]* B3 g0 d
" K. i. i3 j; m
配置SVC* w" v6 k, g6 _" K3 z
( Q$ z' j0 C8 C1 q) `' w
* m9 T5 {; {8 d' F1 r% u' o Q4 @9 t" d: P5 @
设置工程信息 4 d6 u% z$ y! L
4 |$ S5 Y4 B+ c2 m0 p
# T" @+ E, W a5 h. [) _2 c2 r
% |4 w2 U- g7 D: ], d' N工程文件设置 - g( s' @% O( a5 ]
7 f1 R$ W3 |8 z# r2 X
$ w3 l. p+ O N& F0 y# \1 h0 T0 }- L: l4 N1 _' J( T* E" }2 q4 M6 G3 @) o
Keil工程配置 M( X3 h, n/ N
4 f: d% R& M' E) a7 U9 ], X
4 T$ U9 z* Y2 p2 p* w
- N* h0 C3 R" X3 J% l) [代码配置
5 C/ g1 v& C i* k! |在main.c中添加如下头文件。! y5 Z* R5 c; V& N6 T
- /* USER CODE BEGIN Includes */& o; R) C0 C6 s5 I$ g, e( L
- #include "stm32_seq.h"2 S+ W4 K; m5 \. i( @
- /* USER CODE END Includes */
复制代码
4 @* v& Q7 |; C( ]) a8 D! e* |0 B3 UUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
- a6 B6 X: K6 i1 [# `4 _- /* USER CODE BEGIN WHILE */+ ]8 S0 W7 i: ]5 i0 I
- while (1)* u( j# C& w7 B9 Q# p! n; q
- {
6 y9 E( R- u4 u! J& ]& ^) ?1 H - /* USER CODE END WHILE */: h- W# Z1 W: ?. z: y4 v2 ?3 n" m
- MX_APPE_Process();4 o6 O% O4 k, n2 H: K
- ' O" s ]1 g1 M: K- N4 S h
+ P* x" y4 d' u. \- A. ]- /* USER CODE BEGIN 3 */# W) P$ l \6 W# _9 e) k' x
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
& U/ n ]) ?, ~5 M& B0 Q, c, \ - }5 Q4 a: O. C; O8 h% n: o. G
- /* USER CODE END 3 */6 ^% G+ C3 z+ X0 S6 x! k
- }
复制代码
" }# @+ G$ [( T9 o+ u在app_entry.c中添加初始化 APPD_Init()。3 }& h( ?0 ^: ~ b
- void MX_APPE_Init( void )' z8 N# U0 j& e/ }
- {8 b8 X9 Z1 | E& z5 ?( u5 A
- System_Init( ); /**< System initialization */! E! E0 C4 x0 o2 {
- : I. T$ `# ^! O4 A- q9 F
- * u, }$ k3 P8 E" t" c
- SystemPower_Config(); /**< Configure the system Power Mode */9 j- a: t6 V3 u* i
9 z7 Z6 `3 o; z8 Z. L8 S
2 J8 M5 N' h- d5 j2 l# S9 q& S- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */: [' v7 e& S1 t5 O9 I7 m* @
- 8 f, A4 C* K, y6 J, H; I' B6 M
) S& ]3 D9 R/ z$ }' i3 H- /* USER CODE BEGIN APPE_Init_1 */0 c) Y2 `/ s f# m8 U* D3 }
- APPD_Init();
c4 |0 ^4 h/ V/ l {" B - /* USER CODE END APPE_Init_1 */
- @' X# r* K) N6 F# |: N - appe_Tl_Init(); /* Initialize all transport layers */
9 u7 D9 z+ x7 r - " Y* }( p4 C1 V" c9 q* X4 }
1 k9 f) \( d) n- /**$ t6 s9 Y5 s8 F, o O
- * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )0 o: h; a6 q, i8 n
- * received on the system channel before starting the Stack
# D' [7 [' ]; x0 I- O - * This system event is received with APPE_SysUserEvtRx()
0 h# c' x" l8 ^" W4 x8 Z+ D - */
7 g# c. E; r# J, K4 q$ Y3 E: R - /* USER CODE BEGIN APPE_Init_2 */* E8 Y' x$ c* G7 ]9 r
$ R: x8 h4 R* ~& b! D+ h) c- ; Q+ j$ N$ G: l- y Q& r
- /* USER CODE END APPE_Init_2 */
, K4 Y1 }$ X& g4 H0 n+ U1 {9 y, ~) U7 W - return;
9 ~5 |4 G$ y, N+ L1 A. o A - }
复制代码
4 k$ w H1 e# d$ c2 A结果演示
$ v% Y% l( l9 K在app_ble.c中,数组a_AdvData定义了设备名称。. h" M" C2 I, G6 {
3 p& S- ?2 l9 l8 p
, f" h z+ Y0 I+ b: N4 A) {) f: }* Y- {- \9 h
将设备设置为一般可发现模式,若成功会打印如下参数。
: F/ Y$ s6 b) s6 O; j3 c G" @' R& X. M$ R; Q# N5 ~! }+ E( z. y3 |/ N C
; U! H! ~& D: U# F
. l( C* E7 S- Z# u$ K串口打印如下所示。
7 n0 s* g+ x3 t% y# f4 ]4 g; v* l3 R
+ K7 |4 H& u3 ~0 H( X6 p
转载自:记帖
1 e$ E6 u- V" [" p如有侵权请联系删除1 r8 ?2 u9 p' m4 b: U6 o
- {* [( `/ @0 z4 d: M
# u+ N0 W! G6 r/ ]0 s8 n
: H- ?0 ?2 s+ t5 A; V |