STM32串口日志打印

我使用的是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__表示当前代码的行数,还有更多大家可以根据需要添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值