STM32F767 Nucleo 板 printf 到控制台

问题描述 投票:0回答:1

在过去的几天里,我一直在尝试让 printf 将调试消息打印到 STM32CubeIDE 控制台。然而,没有任何运气。我浏览了无数的论坛帖子和讨论,但似乎没有一个完全解决了这个众所周知的奇怪问题。

我刚刚使用 STM32CubeMX 生成了一个全新的项目,并使用了 Nucleo 板的默认配置。我只是使用带有内置 ST-LINK 的 USB 电缆来对设备进行编程。

到目前为止,有人建议我添加几行代码,显然应该可以解决问题,但事实并非如此:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif


PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

我还包括:

#include "stdio.h"

实际代码:

int main(void)
{
  /* USER CODE BEGIN 1 */
    uint8_t uart3_data[20] = "Hello from UART 3";
    uint8_t uart1_data[20] = "Hello from UART 1";
  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals. Initializes the flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */


  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  MX_USART1_UART_Init();
  MX_TIM10_Init();

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim10);
  /* USER CODE END 2 */


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
      //Toggle_leds(GPIOB,GPIO_PIN_0,100);

      HAL_Delay(1000);
      printf("UART Printf Example: retarget the C library printf function to the UART \n\r");
      printf("** Test finished successfully. ** \n\r");
      HAL_UART_Transmit(&huart3,uart3_data, sizeof(uart3_data), 50); // just to see what happens

      //HAL_UART_Transmit(&huart1,uart1_data, sizeof(uart1_data), 50); // just to see what happens
  }
  /* USER CODE END 3 */


}

当我打开终端并连接到设备时,我可以看到消息按预期发送:

Enter image description here

但是,我不明白为什么我看不到STM32CubeIDE控制台上显示的消息。我是否缺少一些额外的配置?

printf stm32 nucleo stm32cubeide
1个回答
2
投票

我已经成功让它发挥作用了。遇到同样问题的人,只需按照以下简单步骤操作即可:

  1. 将自定义 _write 函数添加到 syscalls.c 甚至 main.c:

    int _write(int file, char *ptr, int len)
    {
      /* Implement your write code here. This is
         used by puts and printf for example */
      int i=0;
      for(i=0 ; i<len ; i++)
        ITM_SendChar((*ptr++));
      return len;
    }
    
  2. 在调试配置中,启用 SWV 跟踪并将核心时钟设置为设备的 SYSCLK(见下图)。

    Debug configuration

  3. 调试代码并转到 Windows → 显示视图SWVSWV ITM 数据控制台

    现在您应该已启用 SWV 数据控制台。检查下图:

    SWV ITM Data console

  4. 打开 SWV ITM Data 控制台设置并确保端口 0 已勾选(见下图):

    Enable port 0

  5. 运行代码时,请确保启用开始跟踪:

    Enable start tracing

  6. 享受在控制台打印消息的乐趣

YouTube 的详细指南可以在 5 中找到。教程。通过 printf 使用串行线查看器 (SWV/SWO) 在 STM32CubeIDE 中调试 STM32

不幸的是,使用这种方法仍然存在麻烦。每次调试代码时,都需要开始跟踪。必须有一种简单的方法可以在控制台中显示消息而不使用跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.