在 Nucleo STM32 板上设置 SWV printf (C++)
Setting up SWV printf on a Nucleo STM32 board (C++)
我使用的是 STM32G431KB,与其他 stm32 Nucleo 相比,它连接了 SWO。我发现了这个问题 并遵循了第一个答案。因此,我得到了C下的SWV 运行ning。但是我一切换到C++,就没有输出。
我为 C 使用了一个新项目,将 Debug 切换为“Trace Asynchronous SW”,添加:
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
ITM_SendChar(*ptr++);
}
return len;
}
/* USER CODE END 0 */
进入主循环
/* USER CODE BEGIN 2 */
int i = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("%d Hello World!\n", ++i);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
然后我在调试配置中打开 SWV,并将核心时钟设置为 170 Mhz。最后,我在 SWV 设置中关闭时间步长并启用端口 0。
当我现在 运行 项目一切正常,我得到一个输出。
但是当我将项目切换到 C++ 并将 main.c 重命名为 main.cpp 时。项目 运行s,但没有任何输出。
因为您的 _write
函数不再是 _write
,因为它的名称被 C++ 编译器破坏了。所以你 link 使用什么都不做的“旧”你需要声明它 extern "C"
extern "C" {
void ITM_SendChar(char par);
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
ITM_SendChar(*ptr++);
}
return len;
}
} /*extern "C"
我使用的是 STM32G431KB,与其他 stm32 Nucleo 相比,它连接了 SWO。我发现了这个问题
我为 C 使用了一个新项目,将 Debug 切换为“Trace Asynchronous SW”,添加:
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
ITM_SendChar(*ptr++);
}
return len;
}
/* USER CODE END 0 */
进入主循环
/* USER CODE BEGIN 2 */
int i = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("%d Hello World!\n", ++i);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
然后我在调试配置中打开 SWV,并将核心时钟设置为 170 Mhz。最后,我在 SWV 设置中关闭时间步长并启用端口 0。
当我现在 运行 项目一切正常,我得到一个输出。
但是当我将项目切换到 C++ 并将 main.c 重命名为 main.cpp 时。项目 运行s,但没有任何输出。
因为您的 _write
函数不再是 _write
,因为它的名称被 C++ 编译器破坏了。所以你 link 使用什么都不做的“旧”你需要声明它 extern "C"
extern "C" {
void ITM_SendChar(char par);
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
ITM_SendChar(*ptr++);
}
return len;
}
} /*extern "C"