我使用的是Keil目录下Retarget.c文件,在文件中已经将printf重定向过了,你需要去实现
sendchar(int ch); /* in Serial.c */
getkey(void); /* in Serial.c */
这两个函数,你可以选择使用轮询方式或者中断方式
Retarget.c文件在Keil\Core\ARM\Startup目录下,其源代码如下
/******************************************************************************/
/* RETARGET.C: 'Retarget' layer for target-dependent low level functions */
/******************************************************************************/
/* This file is part of the uVision/ARM development tools. */
/* Copyright (c) 2005 Keil Software. All rights reserved. */
/* This software may only be used under the terms of a valid, current, */
/* end user licence from KEIL for a compatible version of KEIL software */
/* development tools. Nothing else gives you the right to use this software. */
/******************************************************************************/
#include <stdio.h>
#include <time.h>
#include <rt_misc.h>
#pragma import(__use_no_semihosting_swi)
extern int sendchar(int ch); /* in Serial.c */
extern int getkey(void); /* in Serial.c */
extern long timeval; /* in Time.c */
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
return (sendchar(ch));
}
int fgetc(FILE *f) {
return (sendchar(getkey()));
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int ch) {
sendchar (ch);
}
void _sys_exit(int return_code) {
while (1); /* endless loop */
}
我是在usart.c文件使用轮询方式实现,因为调试只用输出,所以只需要完善sendchar函数,getkey函数不需要实现但是是必要的,所以我在函数中就return 0了。
/* USER CODE BEGIN 1 */
int sendchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int getkey(void)
{
return 0;
}
/* USER CODE END 1 */
实现效果如下
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
printf("[%s] %d: 123\r\n", __func__, __LINE__);
osDelay(2000);
}
/* USER CODE END StartDefaultTask */
}
这里的__func__, __LINE__是printf的宏定义,__func__表示当前执行的函数,__LINE__表示当前代码的行数,还有更多大家可以根据需要添加。