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

STM32CubeIDE SWV 功能简介

[复制链接]
STMCU小助手 发布时间:2022-8-4 23:29
1. 引言3 Q. v( o5 k; `" Z& V& g
STM32CubeIDE 是 ST 官方推出的集成开发环境,集成了很多 STM32 的调试与开发工具。7 L; x$ z3 l, K2 y0 o
本文主要介绍如何使用 SWV 功能来打印输出。3 W$ S% U, A3 a* h& l6 x( R
2. 问题描述6 F2 o; e: J5 p4 {2 V, N- s" E
客户使用 STM32CubeIDE 开发环境,将 Printf 定位到串口上是正常的,但是在重定位到SWO 上却出现了无法打印的问题。客户也参考了网上的教程,仍然无法实现,不知道是什么原因。
: g' H" g: \: T. o- P6 o* T) bSTM32CubeIDE 版本:V1.6.1
+ e# k( V) L8 `8 e; d. R硬件环境:Nucleo-G431RB
: J' S& s& t' X6 Y: x1 Y7 }: C5 H( u
1 A' R- s, P9 `: {- h7 r
EZ7L)IAA`[VX){M_NEUU1US.png
& c  D7 a' S- Q- g
: `$ l; S( X  ?8 h3. 问题分析与定位; j, w/ S4 e) f! A. D0 P
首先,我们需要查找资料,在《UM2609 STM32CubeIDE user guide》的第 4 章中,对于SWV 有比较详细的介绍。此处推荐先查看官网文档,这个文档本身是非常权威的。可能你在网上也会找到关于 SWV 功能的介绍,但是这个文档还是必须要看的,因为这个是源头。
8 |( K7 g; C) Q通过查看这个文档,知道了实现 SWV 的简单步骤如下:
& @% h% I1 g2 _/ Q( O第一步:在 Pinout & Configuration 选项中打开 SWO 的功能,此步骤是必须的。
* q+ x. L+ s; [; V4 j# x
/ u$ n6 |7 t7 z0 p, o# I

3 j3 m' s( X% ^" K' r 3~C(12@%F~1QGFAIC@}YM}U.png
; t, c* S* ?* g7 w# e5 ?
/ I- s8 w3 v3 Z" N, G
  w) n+ {+ R' E" @1 i5 r
第二步:重定位 printf 的接口函数。7 H3 |- {1 d$ {, v6 C( L" u
这里有个简单的方法,直接在 syscalls.c 文件中,改写_write()函数的内容,代码如下所示。再在此文件中包含 ITM_SendChar 实现的头文件 core_cmX.h,此文件一般都是已经被包含在你所选择的器件型号的头文件中。此处我们选择的是 stm32g431xx.h,直接放在此文件的开始处即可。* v  H% c2 U) n
  1. #include "stm32g431xx.h", h; g' n. d; w: }. i9 N
  2. __attribute__((weak)) int _write(int file, char *ptr, int len): r7 k. U7 G, X+ e
  3. {. D: U- {' K' q
  4. int DataIdx;
    6 `" h# c( R  L/ J. q! ^; X0 H1 h
  5. for (DataIdx = 0; DataIdx < len; DataIdx++)
    0 l! z, t6 d9 y; N2 d7 Y
  6. {
    1 H/ Y3 o2 d0 e5 [7 y+ b2 O4 Z
  7. //__io_putchar(*ptr++);9 t. |& z' `: |
  8. ITM_SendChar(*ptr++);
    + G/ o$ w: `; w/ W! w
  9. }  h0 j9 [0 Q6 q; R
  10. return len;
    ! I) ]1 T& I: a4 ]1 l" O
  11. }
复制代码

+ }, K* J' Q0 R, N4 w4 a: p& g9 T9 V/ x# D3 v
第三步,在 main.c 文件中包含 stdio.h 这个头文件,并尝试打印 printf,此处注意,打印不能很频繁,所以需要增加延时。
! k# [6 A9 @9 q
  1. #include <stdio.h>* g5 V; c. S1 P7 c8 h* w
  2. uint8_t Count=0;
    ' o/ _& \5 ]/ A1 Q  t
  3. /* USER CODE BEGIN WHILE */' c: E( _, U/ e, `' r+ R1 K
  4. while (1)
    6 E7 Y5 a1 J- S3 @- D. \
  5. {
    & ^( ~+ d" R  M7 R, Y0 y
  6. HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    % [' h6 i4 S1 n0 T- v- j2 M3 e8 j
  7. HAL_Delay(1000);
    1 D' n& ?& X# `+ g6 E- w! _2 V
  8. printf("Hello World, Count=%d\r\n", Count++);
    3 V2 ?3 ~6 _: O7 _
  9. /* USER CODE END WHILE */* l( X2 q2 [- ]* r: l6 @$ Q
  10. /* USER CODE BEGIN 3 */
    . ]- g, m8 O' t* k  w6 y; P
  11. }
    8 v6 c! e' X% T6 Q* t
  12. /* USER CODE END 3 */
复制代码
* Z) Q+ }  F" I6 [0 x% v/ ?: l( |* N
0 ~/ j" M$ ]7 q
全局编译一下,查看是否有错误,如果有错误,请对应提示信息修改。编译没有错误之后,我们就可以进行下一步了。 6 k% B- P7 ^" ?! B( ^
" d* e" q( o' [! [1 W- Q

. x9 O9 g5 u& o+ ~, E K)Q~IV6SX1TA[)$LK]VD(NI.png
( S- d8 I1 A6 c9 H: V* \- R! K  s  k
* P9 l  M5 U7 U9 P
% i! r6 @* Z+ S0 ]9 V( r* Z
第四步,配置仿真调试参数。打开 SWV 的调试功能。此处注意:Core Clock 必须与你配置的时钟是一致的。此处我配置是 170MHz,与我的系统时钟一致。
2 [( Y  V8 _" V% o
3 a5 R) j. m& j/ X" X4 X# j  G
  `) t, f% w/ t' M2 w4 P6 s
5M%ID[_BDW}BY1LGG[[S{P6.png
5 h" E3 b# i" r) r
% n& k0 y6 F0 h7 b' C
第五步,开始进入调试界面,并在调试界面中打开 Windows-->Show View-->SWV 的 ITM dataConsole 窗口。注意,整个 SWV 其实是共用一个配置文件的,所以,当你打开 SWV 内的任意一个窗口都可以进行 SWV 的配置。在这里我们只是为了查看 Printf 的内容,所以就选择了 SWVITM Data Console 窗口。关于这里边其他几个部分的详细说明参考 UM2609 的 4.3 章节的内容。
5 s( Q& T5 U9 z, o- X; Z! ]6 e$ F6 b+ u5 n1 J8 `. E! J
& V# Y# U9 W! s9 |/ ~' m' j$ e) m& J

3 @0 ]7 [& a5 c' P' U- ]完整版请查看:附件2 _( W$ [: h, @+ t2 U& S8 P3 l

: H) x) M/ S. y0 c
8 G4 s0 o9 Z0 Q0 n/ O5 m0 K! ^9 I

* M2 @6 d/ X5 ?& t

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 手机版