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

STM32CubeIDE SWV 功能简介

[复制链接]
STMCU小助手 发布时间:2022-8-4 23:29
1. 引言: i& C3 w( H$ V+ m+ s5 l& V  N5 ~
STM32CubeIDE 是 ST 官方推出的集成开发环境,集成了很多 STM32 的调试与开发工具。4 n) |2 z! j% N5 `! K# `% Y
本文主要介绍如何使用 SWV 功能来打印输出。
$ C4 Z0 j# U# w! b) d8 ]1 ~! u& \( C
2. 问题描述4 M/ J6 J3 z& Y7 O, t; a, W. H
客户使用 STM32CubeIDE 开发环境,将 Printf 定位到串口上是正常的,但是在重定位到SWO 上却出现了无法打印的问题。客户也参考了网上的教程,仍然无法实现,不知道是什么原因。
+ L% O' n0 N/ Z, iSTM32CubeIDE 版本:V1.6.1
# T: n+ P( K. @' U/ p9 y硬件环境:Nucleo-G431RB, v: l0 Y4 t2 R. ]% T! H
; T5 t# p0 n: V" c5 O0 N6 ~
0 k3 V, n5 O! n# x8 T, d. t
EZ7L)IAA`[VX){M_NEUU1US.png
. R3 A6 U2 B1 Z% \5 V
8 L; y! `+ ~" d' N) F3. 问题分析与定位0 N8 L* s: f/ w
首先,我们需要查找资料,在《UM2609 STM32CubeIDE user guide》的第 4 章中,对于SWV 有比较详细的介绍。此处推荐先查看官网文档,这个文档本身是非常权威的。可能你在网上也会找到关于 SWV 功能的介绍,但是这个文档还是必须要看的,因为这个是源头。: P( G( f; b6 i* h$ K% q+ U9 e
通过查看这个文档,知道了实现 SWV 的简单步骤如下:; x  F' _1 O5 [& V# E: y
第一步:在 Pinout & Configuration 选项中打开 SWO 的功能,此步骤是必须的。
6 `, m1 p  f" M2 r
8 {; f/ h, q0 t
  Y$ O) P0 B- s' C( r% b
3~C(12@%F~1QGFAIC@}YM}U.png
; H" c& X' O0 J3 w9 L# r
3 _5 t, o5 d/ T' R) U3 W

8 Z$ X( i/ ]# D# E8 w( h  Q第二步:重定位 printf 的接口函数。5 g9 T  h% c" h  x
这里有个简单的方法,直接在 syscalls.c 文件中,改写_write()函数的内容,代码如下所示。再在此文件中包含 ITM_SendChar 实现的头文件 core_cmX.h,此文件一般都是已经被包含在你所选择的器件型号的头文件中。此处我们选择的是 stm32g431xx.h,直接放在此文件的开始处即可。
0 x0 e* u7 b3 O6 {2 o9 ^& z
  1. #include "stm32g431xx.h"! E" ]9 G# n6 X: M& f
  2. __attribute__((weak)) int _write(int file, char *ptr, int len); I% M2 b  ]! b  v5 c
  3. {
    5 {5 }4 q( x8 D1 K. b( X
  4. int DataIdx;
    8 o3 R# O$ t/ l% |
  5. for (DataIdx = 0; DataIdx < len; DataIdx++)
    ( T( \+ @( v6 n) J2 H# e3 {5 i! w
  6. {
    5 S' f4 Q4 c1 ~. c# b8 f
  7. //__io_putchar(*ptr++);. [7 m2 k$ ?1 q% }: h! I, b
  8. ITM_SendChar(*ptr++);
    ; C* i* e4 u8 ~$ a
  9. }# l& p" U+ j( ]* t+ f8 U
  10. return len;8 T$ V9 I, H# X0 X3 @* y
  11. }
复制代码

- {6 Z* J( k5 e. o* F$ u) K/ U" f& z* o9 q
第三步,在 main.c 文件中包含 stdio.h 这个头文件,并尝试打印 printf,此处注意,打印不能很频繁,所以需要增加延时。; D% l; |7 Q+ ^$ M
  1. #include <stdio.h>
    9 Q8 Z6 P+ l" v( ?. `4 r
  2. uint8_t Count=0;
    9 ^3 m7 J, j$ j9 `  y: f
  3. /* USER CODE BEGIN WHILE */$ r$ ~1 V- {. Z
  4. while (1)
    / f+ t" L* M+ Z) g6 [1 a
  5. {" T+ b' i% h5 h/ N" _) v
  6. HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    5 I4 j* `8 R. t7 h8 m
  7. HAL_Delay(1000);
    3 z! J; R! C  o- ~+ ^
  8. printf("Hello World, Count=%d\r\n", Count++);
    4 l- a0 J2 G- {8 L# r$ p2 X
  9. /* USER CODE END WHILE */1 `3 {; Z8 Y: Q5 l
  10. /* USER CODE BEGIN 3 */2 V* g) f( y7 E
  11. }0 V: \& t) O% O& Y! S) n
  12. /* USER CODE END 3 */
复制代码
& C8 \9 V7 y, b

+ h" E' j& V! L全局编译一下,查看是否有错误,如果有错误,请对应提示信息修改。编译没有错误之后,我们就可以进行下一步了。 ! t* B# t- u4 x3 I

9 W" E0 _) i# R  t, z9 K

9 j6 i7 _; f8 K; d5 T K)Q~IV6SX1TA[)$LK]VD(NI.png
' c) H- G4 @" E& i& B/ B& I7 _' n) f* C
, z2 H( u1 t% Y, g: G
第四步,配置仿真调试参数。打开 SWV 的调试功能。此处注意:Core Clock 必须与你配置的时钟是一致的。此处我配置是 170MHz,与我的系统时钟一致。8 m6 c' D7 h' E
) L* x* Z8 H% t" u. N

  A7 F; i( I9 @$ ~ 5M%ID[_BDW}BY1LGG[[S{P6.png $ A, V7 |, ~3 Z3 y, P* U$ a

: q  y7 u0 c3 K# Q7 p* I第五步,开始进入调试界面,并在调试界面中打开 Windows-->Show View-->SWV 的 ITM dataConsole 窗口。注意,整个 SWV 其实是共用一个配置文件的,所以,当你打开 SWV 内的任意一个窗口都可以进行 SWV 的配置。在这里我们只是为了查看 Printf 的内容,所以就选择了 SWVITM Data Console 窗口。关于这里边其他几个部分的详细说明参考 UM2609 的 4.3 章节的内容。
, V% ~9 c& j  K/ I
  c9 \( M2 s9 M0 p6 p
; h; {1 @4 }% g# S
6 C% x- j3 a. Z) Q: x3 w. i* o
完整版请查看:附件
! d" u# G9 J6 [! k/ A6 F- Y( ?5 a9 e1 ~

, s5 C% p& H* Q' u. f. ?  _: _0 D: N

LAT1024_STM32CubeIDE_SWV_功能简介.pdf

下载

847.96 KB, 下载次数: 13

收藏 评论0 发布时间:2022-8-4 23:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

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