printf重定向

本文介绍了如何在STM32上实现printf函数的重定向,以便通过串口查看调试信息。首先回顾printf函数的基本原理,然后详细说明在MDK中使用MicroLib库时,通过寄存器或HAL库实现串口输出的步骤,提供了相应的代码示例。通过这两种方式,开发者可以在STM32开发过程中便捷地进行串口打印调试。
摘要由CSDN通过智能技术生成


前言

在初学C语言时,最常用的一种调试方式或者显示数据方式就是利用printf函数将自己想看的数据显示出来,但是到了STM32上,并没有直接提供这样的函数,往往想看一些变量的值的时候,没法简单的直接打印出来,因此本文介绍在STM32上printf函数的实现方式。


一、printf函数介绍

printf函数定义在<stdio.h>头文件中,如下:

int printf(const char *format,...)

以format的格式进行数据输出,通过调用底层函数fputs去逐个打印出字符。fputs函数定义如下:

int fputs(int ch,FILE *stream)

将字符ch输出到给定输出流stream(stdout)。因此实现fputs函数的在STM32上单个字符输出,即可完成printf的重定向。

二、重定向实现

在MDK中使用MicroLib库

MicroLib是对标准C库进行高度优化之后的库,相比标准库,MicroLib的代码更少,占用资源也更小。
test
勾选图中所示选项即可。
下方给出在使用寄存器和HAL库两种方式的实现方式,任选一种即可:

  • 寄存器实现方式
#include <stdio.h>

int fputs(int ch,FILE*stream)
{
	while((USART1->ISR & 0x40) == 0);//发送完成跳出
	USART1->TDR =(uint8_t)ch;
    return ch; 
}
  • HAL库实现方式
#include "stdio.h"
#include "stm32f1xx_hal.h"
extern UART_HandleTypeDef huart1;

int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch, 1, 0xFFFF);  
	return ch;
}

选择上方任意一种方式的代码加入到自己的工程,即可实现printf输出内容。

总结

以上是在MDK中使用MicroLib的情形下的重定向方式,如果是在MDK的标准库下或者GCC的标准库下,实现方式会不一样,具体可参考printf重定向

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值