在过去的几天里,我一直试图让printf工作,以便将调试消息打印到STM32CubeIDE控制台。然而,没有运气。我已经经历了无数的论坛线程和讨论,他们似乎没有完全解决这个奇怪的问题,是众所周知的。
我刚刚用STM32CubeMX生成了一个全新的项目,并使用了核心板的默认配置。我只是使用USB电缆与内置的ST-链接,以编程的设备。
到目前为止,我被建议做的是添加几行代码,这些代码显然应该修复这个问题,但它没有:
#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 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控制台上被驱散。我是不是遗漏了一些额外的配置?
发布于 2021-01-11 05:56:31
我已经设法让它起作用了。那些有同样问题的人,只需遵循以下简单的步骤:
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;
}现在您应该启用SWV数据控制台,检查下面的映像:SWV数据控制台
5.运行代码时,确保启用了启动跟踪:启用启动跟踪
关于youtube的详细指南可以在这里找到:channel=RADAS
不幸的是,使用这种方法仍然有麻烦。每次调试代码时,都需要开始跟踪。必须有一个简单的方法在控制台中显示消息而不使用跟踪。
https://stackoverflow.com/questions/65629906
复制相似问题