对于 printf 函数相信大家都不陌生,第一个C语言程序就是使用 printf 函数在屏幕上的控制台打印出Hello World,之后使用 printf 函数输出各种类型的数据,使用格式控制输出各种长度的字符,甚至输出各种各样的图案。除此之外,在程序出错的时候,懒得调试,直接简单粗暴的加个 printf 找bug,有时候也不失为一种有效的方法,在串口调试中,我们经常会使用到printf这个函数。
1. STM32f103重定义fputc函数
将下列代码插入到USART.c文件中
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
2. STM32G030重定义fputc函数
2.1. 勾选Use MicroLib
MicroLib是对标准C库进行了高度优化之后的库,供MDK默认使用,相比之下,MicroLIB的代码更少,资源占用更少:
![](https://img-blog.csdnimg.cn/img_convert/12112101414a5cd1c1a2f40acb01dd43.png)
2.2. 添加下列代码及头文件
// 串口重定向
#include <stdio.h>
#include <string.h>
int fputc(int ch, FILE * f)
{
while(!(USART1->ISR & (1<<7)));
USART1->TDR = ch;
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch;
while(!(USART1->ISR & (1<<5)));
ch = USART1->RDR;
return ch;
}
备注:如遇到报错,需要在启动文件中注释以下代码