【转】STM32CubeIDE SWV 功能简介
1. 引言STM32CubeIDE 是 ST 官方推出的集成开发环境,集成了很多 STM32 的调试与开发工具。
本文主要介绍如何使用 SWV 功能来打印输出。
2. 问题描述
客户使用 STM32CubeIDE 开发环境,将 Printf 定位到串口上是正常的,但是在重定位到
SWO 上却出现了无法打印的问题。 客户也参考了网上的教程,仍然无法实现,不知道是什么原
因。
STM32CubeIDE 版本: V1.6.1
硬件环境: Nucleo-G431RB
3. 问题分析与定位
首先,我们需要查找资料,在《UM2609 STM32CubeIDE user guide》的第 4 章中,对于
SWV 有比较详细的介绍。 此处推荐先查看官网文档,这个文档本身是非常权威的。可能你在网上
也会找到关于 SWV 功能的介绍,但是这个文档还是必须要看的,因为这个是源头。
通过查看这个文档,知道了实现 SWV 的简单步骤如下:
第一步:在 Pinout & Configuration 选项中打开 SWO 的功能,此步骤是必须的。
第二步:重定位 printf 的接口函数。
这里有个简单的方法,直接在 syscalls.c 文件中,改写_write()函数的内容,代码如下所
示。 再在此文件中包含 ITM_SendChar 实现的头文件 core_cmX.h,此文件一般都是已经被包含在
你所选择的器件型号的头文件中。此处我们选择的是 stm32g431xx.h,直接放在此文件的开始处
即可。 #include "stm32g431xx.h"
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
//__io_putchar(*ptr++);
ITM_SendChar(*ptr++);
}
return len;
}
第三步,在 main.c 文件中包含 stdio.h 这个头文件,并尝试打印 printf,此处注意,打印不能很频
繁, 所以需要增加延时。 #include <stdio.h>
uint8_t Count=0;
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(1000);
printf("Hello World, Count=%d\r\n", Count++);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
全局编译一下,查看是否有错误,如果有错误,请对应提示信息修改。 编译没有错误之后,我们
就可以进行下一步了。
第四步, 配置仿真调试参数。 打开 SWV 的调试功能。 此处注意: Core Clock 必须与你配置的时钟
是一致的。此处我配置是 170MHz,与我的系统时钟一致。
第五步,开始进入调试界面,并在调试界面中打开 Windows-->Show View-->SWV 的 ITM data
Console 窗口。注意,整个 SWV 其实是共用一个配置文件的,所以,当你打开 SWV 内的任意一
个窗口都可以进行 SWV 的配置。在这里我们只是为了查看 Printf 的内容,所以就选择了 SWV
ITM Data Console 窗口。关于这里边其他几个部分的详细说明参考 UM2609 的 4.3 章节的内容。
图 5. 开启 SWV ITM 数据窗口
此窗口打开后,需要新增一个 Port 端口。 默认 TIM 中使用的就是 0 端口,所以我们直
接选 0 即可。
选择点击配置按钮 对参数进行配置。配置情况如下:
推荐先复位一下工程(可选项),然后“启动跟踪/start trace” 。 注意:此处是先启动跟踪,之后
再让程序运行起来,不能反序。
此时即可看到打印出来的内容了。
4. 小结
其实很多的内容都已经在手册中有详细的描述,但是因为英文或者是时间的问题,我们大部分人
没有时间和精力阅读完所有的文档的。所以在遇到问题时候,会阻塞你比较长时间。希望本文在
你遇到困难的时候能够给你一点启示,帮你快速解决手中的问题。本文提供了范例程序,直接参
考 Demo_Printf_G431RB.7z 此文件即可。
参考文献
【如有, 请注明;否则,请注明:无】
文档中所用到的工具及版本
1、 STM32CubeIDE V1.6.1
2、 Nucleo-G431RB
LAT 中的附件
1、 LAT1024_Demo_Printf_G431RB.7z
版本历史(内部参考)
(仅供内部参考, 评审过程中,评审员需要删除这部分 : 版本历史(内部参考)
版本历史
重要通知 - 请仔细阅读
意法半导体公司及其子公司 (“ST”)保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产品的
最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。
买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。
ST 不对任何知识产权进行任何明示或默示的授权或许可。
转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。
ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财
产。
本文档是 ST 中国本地团队的技术性**,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与 ST
官网资料不一致,请以实际应用验证结果和 ST 官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息,我
们也不承担因使用或采纳本文档内容而导致的任何风险。
本文档中的信息取代本文档所有早期版本中提供的信息。
© 2020 STMicroelectronics - 保留所有权利
STM32CubeIDE性能怎么样? CubeIDE可以调时吗? SWV是什么? 有STM32CubeIDE的教程吗? STM32需要那几个? STM32CubeIDE怎么样? 一直使用的是串口
make_youtiao()执行完后,控制转回到调用函数中
要有一个延时的程序
串口马上正常中断接收
页:
[1]