在 Nucleo STM32 板上设置 SWV printf (C++)

Posted

技术标签:

【中文标题】在 Nucleo STM32 板上设置 SWV printf (C++)【英文标题】:Setting up SWV printf on a Nucleo STM32 board (C++) 【发布时间】:2021-12-16 21:27:23 【问题描述】:

我使用的是 STM32G431KB,与其他 stm32 Nucleo 相比,它具有 SWO 接线。我发现了这个问题Setting up SWV printf on a Nucleo STM32 board 并遵循了第一个答案。因此,我得到了在 C 下运行的 SWV。但是一旦我切换到 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 时。项目运行,但没有任何输出。

【问题讨论】:

【参考方案1】:

因为您的 _write 函数不再是 _write,因为它的名称已被 C++ 编译器破坏。所以你链接到什么都不做的“旧”你需要将它声明为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"

【讨论】:

在 2. 行有一个错误:“../Core/Src/main.cpp:60:6: error: conflicting declaration of C function 'void ITM_SendChar(char)'”,但如果没有这条线,它会很好用!

以上是关于在 Nucleo STM32 板上设置 SWV printf (C++)的主要内容,如果未能解决你的问题,请参考以下文章

stm32wb, nucleo-wb55, 传感器, 硬件

无法在STM32H7上正确设置Cortex M7 ITM

STM32CubeIDE SWV功能使用方法

STM32CubeIDE SWV功能使用方法

STM32F4程序只有在按下复位按钮后才会运行

STM32:STLink 不再通过 SWD 连接