你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开发,通过SWO功能输出Printf函数到Utility

[复制链接]
STMCU小助手 发布时间:2022-5-6 09:33
1 概述" Y; @1 s1 I0 T0 g0 o  Q1 ~
1.1 资源概述

" w" r5 E7 T9 R开发板:ST官方NUCLEO-F103RB开发板( |) x. x3 m9 R- }
CUBEMX版本:1.3.0
$ S  }! }8 ?% E4 @. z8 TMDK版本:5.23
+ w, ]# h6 z8 e4 d主控芯片型号:STM32F103RBT6
1 u) o- G; B# Z& m  e/ j4 K" |5 y  \' p* A2 h: B9 @. W
{X`AM`Z~~2LPEW)NPKLWW.png
: M' f* O/ c% `3 k' j) E8 N" F1 m: b7 _( E7 n' P" _
1.2 SWO功能简介
, I" Q2 m" x7 e' ^SWO也叫做trace(跟踪)功能,通过此功能,只需要在SWD调试基础上增加一条SWO线缆,就可以实现类似串口输出功能,配合printf函数打印相应的信息到utility窗口中。此功能不占用串口资源,无需在中断中执行。2 X9 ?$ C, S- Z# n" k4 ~. I, x

* b5 F+ [8 S& V, R1.3 ITM(指令跟踪微单元)简介6 X' l4 H+ w, }: C% F2 G
我们此次功能实现是通过调用ITM实现的。3 R! h# b8 U6 W# m  l; k
ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统(OS)和应用事件,并发布判定的系统信息。ITM以包的形式发布跟踪信息,它由以下部分组成:9 H! X/ u& {1 L5 }& @9 |
● 软件跟踪:软件可以通过直接写ITM激发寄存器来发布包信息。* q) h  o+ m3 {8 E. d
● 硬件跟踪:ITM会发布由DWT产生的信息包。
  f, g* s% Z3 Y6 j+ V% k& z● 时间戳:时间戳被发布到相应的包上。ITM包含一个21位的计数器以产生时间戳。Cortex-M3的时钟或串行线观测器(Serial Wire Viewer)的位时钟率给计数器提供时钟。
" H: X0 E  |$ q+ f& D由ITM发送的信息包输出到TPIU(Trace Port Interface Unit),TPIU再添加一些额外的包(参考TPIU),然后输出完整的包序列给调试器。1
, k( c7 p8 R! W. d% I
* H7 @# w' `; c+ V! t1.4 实现功能. [& h# L" |6 Q, Z7 d; ~9 W. J: L
本次程序实现的功能如下, d  j: \0 b, {1 r2 w! A
1、复位后,向Serial Wire Viewer(utility)打印信息;: z2 T( \* g6 T, ~8 n6 A! ?
2、按按键BUTTON,LED2灯实现翻转;
2 S% P: J/ ]* d! V# a对于第二条实现,此次文档不详细描述。" O' w' @* k8 g! p/ Z& z

$ s8 h3 k+ j3 n+ n* U. _+ W2 硬件连接以及CUBEMX配置

9 l. |8 H: S4 ?- u% p8 R' t& K2.1 硬件连接
6 j$ j4 ^: h) S; b, _
开发板内部已经将线接好,如下图所示. A8 w) S8 W/ O/ W" B
1 v6 G0 Y4 s$ b. Q- @& F
对于目标板与STLINK仿真器分开的情况,我们需要使用5根线进行连接,如下表所示。. u  b) P& g* y  C) X- f1 a! d

. H' g/ N: \. W+ [" V8 \# J6 ]2 Z ~S)7I4Z$OBTE~(VAQ4~J%6R.png
6 ~& X, x0 a2 o+ Y6 D
' N4 T! ~1 p! y* q2.2 CUBEMX配置% d6 _1 f. b% [9 m6 I2 G
选择异步跟踪模式,此时PB3将会自动定义为SWO端口。5 o$ f" _2 R3 E( k  m0 ~

- B, L0 \, y* d0 H6 M# ~& n 2BNOGTP)$Y@7M7@$JB07H`W.png " M# }2 k. B5 v+ _! I
0 @  r* @' m1 x. X2 I
3 软件开发! F7 ^2 f0 E0 W% T; b" ]
3.1 KEIL软件设置

6 y5 D+ u4 j+ B9 Y% z: P& s  o2 u: P4 KKEIL软件设置如下,这里由于程序使用的内部HSI,系统频率是64MHz,因此填写64MHz,需要根据实际情况进行填写。1 T/ V: S9 |* o% I

. B7 T3 n8 W/ t! |% f 94R{}LIQZ%R][HD_M_VT6$A.png
  \% z% s/ g& ~1 y/ _5 E6 j# u5 _% o6 ~0 O
3.2 程序设计
; A' K3 k; c; }使用CUBEMX生成代码。在主函数中进行修改。
; A% U- ]- y) V# s& [主程序中包含stdio.h函数的头文件,否则将不能识别printf函数。# B* A( `7 c  k, P# ^$ Q- V
# A& i$ g0 _6 Y
  1. #include "stdio.h"
复制代码
0 x, Q1 ~& i: C/ I8 o8 s
fputc 函数宏定义。. O& E, @7 ]! A1 `3 U/ ~3 H

7 i2 p! o# O3 ^+ m* R! e
  1. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
复制代码

& |: `7 w* b0 ^* |  z函数定义,由于printf调用的是fputc函数,通过这么一个转换,printf函数就能调用ITM函数实现输出功能。
  1. PUTCHAR_PROTOTYPE, ^& Z5 X6 Z. _8 L- y0 r' D
  2. {
    3 Y$ v! }( g9 r: H
  3.   ITM_SendChar(ch);
    0 y: ]: X/ G7 x* \' G  D3 G
  4.   return ch;; t6 j/ n6 q; Z4 U* J8 ]3 K
  5. }
复制代码
' X. u0 G( ~+ ~- h  A- p) |# m4 l
TIM_Sendchar()函数在core.cm3.h头文件中有进行定义,如下所述8 d. l" j. \, x+ ~+ s

2 t/ j1 @' B/ ^2 w0 T6 j) I9 F
  1. __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
    1 P6 }2 ]/ j( V. f% I
  2. {4 c) ]: K$ j7 J
  3.   if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */1 v$ w5 O- B) V
  4.       ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */- x" j" Z1 r2 k$ S2 l
  5.   {5 n7 H6 {' u+ S
  6.     while (ITM->PORT[0U].u32 == 0UL)
    9 S5 B( ~& D  B
  7.     {
    ) K# y. Z' a# ]) h
  8.       __NOP();5 U% i, C0 \- `- h0 ]
  9.     }
    1 t* v& i1 y0 V  j. Z
  10.     ITM->PORT[0U].u8 = (uint8_t)ch;
    . F4 Y3 T7 U, x1 q# k% k
  11.   }' L4 J, h: L% t, U
  12.   return (ch);2 e' j  D/ G& Z& N7 W7 K7 Y
  13. }
复制代码
9 U  b6 A( ~& t7 h
在主函数main()中增加printf函数,实现输出。
/ R( j4 o( D% J' ~
. S: D/ `3 U$ \9 p: H1 Y9 y
  1. printf("** Test finished successfully. ** \n\r");
复制代码
1 u% G) E1 x5 a0 G+ R6 t* i
4 实验结果与总结

$ Y! r; {2 D) N4.1 实验结果
' O( ~; h! q' D& Y& x/ k
打开utility软件,点击printf via SWO viewer。
* P0 a" k" w4 G5 K. h9 _9 p+ B# i$ e' D
Z_BSU4B137~`(900%S_WI$Y.png
' a4 j6 o7 \& a% Q4 g4 a; z# X6 q+ v* W, ]1 Z+ |: Z4 f3 b0 V
设置频率,点击Start,将调试板复位(程序设置只运行一次printf,因此每输出一次均需要重新复位),即可发现SWV窗口输出了相应的信息。
9 k8 l9 V% y( K; y, ^# @+ q/ H9 q1 k* Z+ q0 t% q
S(7WHRURI(F7U{YX34V5_GO.png
* A% {- P- o1 i# H
7 {. l9 Q6 I6 q" k. R" ?. X) G! q4.2 总结
6 M( M+ y+ v, C; o! x: p在传统的调试中,我们可能偏向于断点分析或者LED灯的亮灭来判定程序运行状态,但是都不是太直观,对于程序越大越不好操作。使用这个SWO功能能很大程序解决这个问题。我们可以在各种错误处理函数增加相应的提示信息,协助我们进行软件开发工作。/ a/ a0 k6 a9 v7 v' f
- f; X) r- W) f

" M; d: O1 D  Y! w" h% v: v) o/ C: p3 {
; c, E; Q1 E# E7 b1 k3 s% `: W
8P7$UNOG]BI_8I709}5B_B0.png
SZZ~WX0Z5%N4N8T8R1BSDAU.png
赞 收藏 评论0 发布时间:2022-5-6 09:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版