套件概述
8 X# r. D. O/ N6 D) P' e在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。
) q, g9 ]* i/ x% @* l2 H) b0 d" R6 }% q+ ?
9 X" j" H. g+ m, a! N p4 ]
0 x6 B0 [* W- ^3 {0 _5 R* p$ g选择芯片型号
1 ?. G: v5 x7 X# t. x2 v5 ~8 v' O' L' M6 U9 N5 r6 R* A! R+ o
l* G0 D, f- W4 `) K* T8 d, N- s+ O! y& ^# F
配置时钟源 + ^4 p U: u, R3 B
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示:
% z4 q7 }. B1 o }
: z/ m w, \+ }. [( [ ^* L
% G. w* K: [4 Y, I0 ~: F, u1 w
5 F" i+ j; D5 g) w8 i! t- J' O配置时钟树 ' \4 |7 h, s8 ?( ^' m: I9 c
/ r# F3 {$ _" m) a9 r+ b
0 Z7 p2 ]& B& n* C4 l# K' T) |8 c
6 w9 ^9 e0 |" |RTC时钟配置 & E A( @, A( Q% p* w4 E: W2 ^
3 G4 Q2 O1 G& @" D
! i) J3 m. s& Y' C& L& D
; q$ F* U) J! q5 A
RFWKP时钟配置
/ [+ F3 s* _# e+ O$ L1 s: K) j! N
; b5 R; H8 F* U- @
$ {: N2 w$ y0 y$ O) a/ t5 A2 e) o$ j, O! P8 o) b. n* W, o4 o* _0 w
查看开启STM32_WPAN条件
9 n+ g9 w% g! X" p; q) k可以看到,需要开启RF、RTC、RCC、IPCC、HSEM。( A- W- ]4 E y7 z6 I
5 H9 |$ D: X8 W f
2 k! F) F- G' l2 N8 t5 E! n
A' U3 h5 o! M' h) f- q* Q" P0 E
配置HSEM 3 C( ~: F9 l' j
硬件信号量(HSEM)模块用于管理多个进程之间共享的访问权限和资源同步。. B7 k) T% ]& T+ v
开启HSEM如下。
! t, k/ |* U/ h2 l P9 Y
$ @3 y0 a4 g3 |0 H8 \
4 E+ c4 ]& O$ k+ ~" [+ C7 F
) k0 e. t2 m- H- |+ n8 u配置IPCC
5 v/ q* l% r/ A' Y- X通信控制器(IPCC)模块的主要用于cpu之间的信号消息交换。0 A, g2 a! f5 N- J2 Q- p
开启如下所示。- H) E2 c4 F8 B
4 d1 V7 K( q9 [* u5 l
5 q+ Z0 N+ D4 r/ ?
8 o6 @4 i" `- c" K3 i' d配置RTC
* W# p9 w# R( b$ f
7 M& z- h' _* h/ H& G1 D c
, [9 w2 Z$ K- `/ P5 w7 `$ K4 u) {& A0 [# q% p& Q, d$ _
启动RF
6 D3 T" W$ A! \ w, q7 v! z' V2 Y n) G
- B& D y/ y' p$ f
. { }1 v7 |$ a开启蓝牙
8 l9 ?7 C9 i" ?" C; ~, |6 a9 M1 Y' i$ I( j- W4 J
# E; c; U( p' T8 A x
- e8 P& J' o# l5 q# _) P( b
开启串口调试 9 T3 H1 G1 d" g X; I
CFG_HW_USART1_ENABLED允许开发者选择是否使用USART1作为跟踪输出的通道,并且这个配置只在特定的设置下可用。这样的配置通常用于嵌入式系统的调试,使得开发者可以实时查看设备的状态和输出信息。
0 B* o+ g/ q5 O6 v- z1 z7 g( l$ `
6 E1 v1 r5 Q G- Q3 N
* u5 F* g- A+ o( _; o+ {6 |
4 Y& O$ F$ H2 w( P) n7 }CFG_HW_USART1_ENABLED这是一个配置标志,当设置为启用时,USART1会被用作输出跟踪的通道。当禁用时,USART1不会用于这个目的。7 G ]+ |3 o! Z% j" M' J+ Q9 N
& G! G' r( y) [" O仅当USART1由CubeMX用户界面配置时,此特定的硬件配置才可用:这意味着只有在使用ST的CubeMX工具配置USART1时,才可以使用CFG_HW_USART1_ENABLED这一特定的配置选项。: U$ A0 x' ~2 L4 e- ^. W+ H# C0 p
4 _6 F, O( x; l8 v查看原理图可以的是PA9和PA10与CH340链接在一起,且为串口打印端口。 ~" r8 j% J5 L2 {( X6 q4 `( z, {
' H; ~6 g; R3 z% F" t) f
& a! i. V! y3 t
: b3 M b p! h) n6 U串口配置如下。
; u4 j4 u& b, W) k, W2 }
; G9 q- I# A# _$ [ A
& N9 X7 q* n4 m1 n3 a) R* U& m
* I. \3 x: W" \0 a% H9 O开启CFG_HW_USART1_ENABLED。; c. O# M, v+ h y; } a. r
" D5 ^& Q6 y$ j2 V0 O; T& d4 c8 Y E
- I% {. M: c9 G/ ~, _
% I& Q* N) n. w9 a2 `* L5 [, u6 J关闭MX_USART1_UART_Init函数的生成。% S8 w4 a7 s, i( o) w
: _/ V0 r/ \( `+ N3 o6 e$ V
5 l/ [; P I) C( T. K
; D' ^) }0 A# @3 SCFG_HW_USART1_DMA_TX_SUPPORTED允许开发者启用USART1的DMA发送功能。启用此功能可以提高USART1发送数据时的效率,但在配置上可能需要更多的步骤和注意事项。
* g# ?# v! a: `3 j# }
$ D' R* i6 j7 D当其被设置为启用时,USART1将使用DMA来进行数据发送(TX)。DMA允许数据从内存直接发送到外设(在这种情况下是USART1),而不需要CPU的干预,从而提高效率和数据传输速度。
3 ~7 D# q/ ]5 U6 L$ E3 p, d# C7 J/ @. J, f! d; ^. V
) `! ]1 S9 I; s0 X
7 N3 }) V$ R. S6 L开启DMA。
+ s! V+ ~/ V+ k5 E+ O1 y5 s& p8 n1 t8 O! H) m
& [# Z: c. l+ R: d6 U. W4 `# O3 _- K) ^1 b
开启中断。
- k- h3 m+ L$ C+ y$ x. X/ `& b( o; e
. m8 @ o4 g q
1 }4 K- ?6 k# q, E2 T! M& P A启用串口1的tx的DMA。/ c, X& ~: F2 v' a) r( c
: T- ^" H, O A% h" H& V5 k" Y; `) q, H
" R! ~) Y4 \5 x w
: I& N, x. f9 p/ w1 n3 v若无法开启可以重新打开BLE配置。3 C, \" c1 F; r) e
- C; ]; m( E9 r: y: j* P( ]# x- B
# p* p! `$ q/ O, C/ r' F: I7 a: T$ F; n
0 |% M0 T! `$ v; w启动串口1调试跟踪。2 _) A" [, r( Y5 [0 m
4 p0 G5 V F% l( H7 ~" d
! t# J; }+ J1 K0 l; c; `
1 G; `+ r& E0 Y9 \2 t7 h& `4 J# @
启用应用程序中的跟踪 。
2 T E" s9 O) y3 o- i+ P# }( b4 ?% f$ ]: J
% K3 @- D" ]- i7 j. u# r+ q' R4 e
$ q) H2 U5 H/ }配置蓝牙参数 9 B" c+ \ Y0 O2 O. ^
配置为自定义模板。4 z) s. ?/ m* I
/ s* M% r* q& X: J! \' Z5 U* e. _
7 W, Z, ?* g- Y4 o4 T! M( z- b& `
命名设备名
0 F. s @2 `& _. O* P
% h' v- y) v4 F
5 c( ]+ T. e/ W+ w
" j( B$ I# O* q) ~9 G/ A/ u( W
配置BLE GATT4 E1 P, K( ~- e' }; Q) ?% u
4 Y) Q5 a: S0 @& I9 {
6 ?4 W- g- V* d+ Z
4 _; g5 G B8 _+ _. u
配置SVC
) A6 r; s' X5 E: c* q/ b+ X; F4 f% @& d4 [
, k2 H: U6 M( g. e6 X9 p+ h% {( l$ ^9 B& S# e
设置工程信息
. U* W3 j- j( {1 S8 s9 U
& P1 X, `: z' q2 t5 H
% b. Q0 v; L- V1 ?4 ?, D
* Y D5 k+ u- ~, _2 k, h' E
工程文件设置 - R3 o' @ v2 H, G9 [ C9 X
5 V: P& N$ [4 s& f+ N# n/ P3 L# T
# s# S& C. |+ I# ~4 G
/ `3 G& U4 ?2 B. F4 ^
Keil工程配置 4 N' ]8 z; m4 j3 v! Y- M4 o6 C
, V( N* k4 Z4 o7 Q3 o" g7 p1 Q
1 `- B- r% D* L# s, L- }2 n- j4 _4 [ `
代码配置 . p: X1 Q6 W/ V( n0 u% ]" n# k
在main.c中添加如下头文件。
8 ]/ J% C4 @$ w5 ?; O1 ^. ~- /* USER CODE BEGIN Includes */
( U$ f7 e3 ?% J, a2 ~% G6 { - #include "stm32_seq.h"
3 z4 g- J+ C! }! Y" u - /* USER CODE END Includes */
复制代码
- r5 |' x6 b6 m" yUTIL_SEQ_Run(UTIL_SEQ_DEFAULT)函数应该在应用程序的while循环中,启动任务调度。
: d F5 j! C% k; R' E- /* USER CODE BEGIN WHILE */6 Z7 p, H& a/ n- }2 Q3 X
- while (1)) z- v" p# F. C( L7 E1 v1 @
- {
; h5 d1 u6 y+ |( W7 i. [/ p. u - /* USER CODE END WHILE */
* O; N. e& ~9 _. c - MX_APPE_Process();- }9 ?: S" P& f: t2 E; ^! ?
- 6 i. v5 k- h# G$ O
- & ]( X+ a- Z0 t/ ]4 `9 u/ r* m; H
- /* USER CODE BEGIN 3 */# h7 c6 J2 R6 B7 n: r
- UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
& J3 J' C, x8 \4 ^: s- n - }+ r) i# X" I& ~/ Q' t
- /* USER CODE END 3 */. r9 [/ G/ ?' i, H+ l
- }
复制代码
4 a+ m5 W& V2 b+ S: I在app_entry.c中添加初始化 APPD_Init()。/ J) k8 A7 f+ I# @$ ^2 Z
- void MX_APPE_Init( void )
+ H0 C2 j) x) n' k$ K/ R$ A9 x - {
6 f% d. e% d0 q - System_Init( ); /**< System initialization */
: }2 W, ~. Z4 ]8 e) O& `% {* W - ' Q) C# U# [8 T; I8 g
- / Z& M! _0 `: ] K$ W
- SystemPower_Config(); /**< Configure the system Power Mode */
) }* e c6 Q& R4 S. v2 O( w) }1 Y - $ f/ j; P8 }( \, |1 W' j+ W- [
- 9 M& \. [1 @) v. |/ L9 S/ F4 @
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
, f2 |* N W! H0 e
" @+ ^3 o8 g2 Y$ f* B* C% l# c- 6 A3 n. g4 r8 {) J4 \% o5 F# s) r
- /* USER CODE BEGIN APPE_Init_1 */5 v8 `* r$ ]8 }2 B. i8 {
- APPD_Init();
% V- ~# n. I- {; Z. p* f4 w( r9 ` - /* USER CODE END APPE_Init_1 */
% C& y8 b) k: M" y* T - appe_Tl_Init(); /* Initialize all transport layers */
- \7 I) g- s! e7 Q" I/ d. W0 S
1 K% t" G% V1 X
3 A! I W$ J% |, Q( Y* n& A- /**
0 o- [1 R ^! ?3 T" ]8 F- k3 K - * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready ). |: Q, B4 U. A
- * received on the system channel before starting the Stack
! m: r. O3 M; h: i% @% Q { - * This system event is received with APPE_SysUserEvtRx()
4 |' y- E/ v. j - */5 Y# x! l, m& c1 i7 i+ m) e" x2 K5 `4 o: z
- /* USER CODE BEGIN APPE_Init_2 */
* |5 W% {, B1 g! E2 u; P$ y - . ?) F( F5 {& B9 `
- , Y' ]' h( U6 W( \. R! _9 Q/ x g: L
- /* USER CODE END APPE_Init_2 */8 F3 a0 j& u5 K
- return;1 n' _; j; S$ X
- }
复制代码
) @ M1 m. g; U' D$ Q% o结果演示 ; s/ n4 L+ F5 a# ~* C
在app_ble.c中,数组a_AdvData定义了设备名称。- Q1 Z( q( ^. F/ M' I
( p8 x* m3 _6 Q
1 S- f+ O# L$ @% \5 n6 }$ c, a
/ s7 Z- K1 X) l: A l) ~将设备设置为一般可发现模式,若成功会打印如下参数。
( ~5 K6 Q [1 ~% k1 c* s: _* h: c2 t. I2 U4 C* v0 Q) v
. v6 ?' y/ k; V: I$ X, K5 q3 E `. J. `7 G% S, t
串口打印如下所示。
* r" J+ D$ _ p( [+ U; B9 W
T+ ?3 ]' ?0 O3 ]9 u- {4 V9 E
; g5 Q V! e+ }. f转载自:记帖
: Q. B0 j% [* t6 O如有侵权请联系删除1 L, Y7 E8 X! T/ n. U% H
1 E/ `7 s( O* N) s l) r
8 z; w- n$ T5 f( l/ a5 m. T
3 ]5 n: D o( d |