重定向printf函数到串口输出
前言
在初学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的代码更少,占用资源也更小。
勾选图中所示选项即可。
下方给出在使用寄存器和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重定向