首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F767核心板打印到控制台

STM32F767核心板打印到控制台
EN

Stack Overflow用户
提问于 2021-01-08 13:29:07
回答 1查看 5K关注 0票数 1

在过去的几天里,我一直试图让printf工作,以便将调试消息打印到STM32CubeIDE控制台。然而,没有运气。我已经经历了无数的论坛线程和讨论,他们似乎没有完全解决这个奇怪的问题,是众所周知的。

我刚刚用STM32CubeMX生成了一个全新的项目,并使用了核心板的默认配置。我只是使用USB电缆与内置的ST-链接,以编程的设备。

到目前为止,我被建议做的是添加几行代码,这些代码显然应该修复这个问题,但它没有:

代码语言:javascript
复制
#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;
}

我还包括:

代码语言:javascript
复制
#include "stdio.h"

实际代码:

代码语言:javascript
复制
int main(void)
{
  /* USER CODE BEGIN 1 */
    uint8_t uart3_data[20] = "hello from uart3";
    uint8_t uart1_data[20] = "hello from uart1";
  /* 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 */
}

当我打开终端并连接到设备时,我可以看到预期的消息:在这里输入图像描述

然而,我不明白为什么我不能看到消息在stm32cubeIDE控制台上被驱散。我是不是遗漏了一些额外的配置?

EN

回答 1

Stack Overflow用户

发布于 2021-01-11 05:56:31

我已经设法让它起作用了。那些有同样问题的人,只需遵循以下简单的步骤:

  1. 向syscalls.c甚至main.c添加自定义的_write函数:
代码语言:javascript
复制
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;
}
  1. 在调试配置中,启用SWV跟踪并将核心时钟设置为设备的SYSCLK。(见下图)

调试配置

  1. 调试代码并转到视图、->、SWV、->、SWV数据控制台

现在您应该启用SWV数据控制台,检查下面的映像:SWV数据控制台

  1. 打开SWV数据控制台设置,并确保端口0被勾选(见下图):启用端口0

5.运行代码时,确保启用了启动跟踪:启用启动跟踪

  1. 把消息打印到控制台上玩得开心

关于youtube的详细指南可以在这里找到:channel=RADAS

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65629906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档