keil5 重定向printf函数到串口输出

1.写此文章的目的:为了大家少走弯路。
作为新手,使用keil5 HAL 库时,希望利用printf函数打印调试信息到串口助手,按照网上很多教程折腾了1天未能如愿,最后发现直接操作寄存器简单快捷。
2.关于printf函数
对于 printf 函数相信大家都不陌生,第一个C语言程序就是使用 printf 函数在屏幕上的控制台打印出Hello World,之后使用 printf 函数输出各种类型的数据,使用格式控制输出各种长度的字符,甚至输出各种各样的图案。
printf 定义在 <stdio.h> 头文件中,如下:
int printf(const char *format, …);
printf 函数根据 format 字符串给出的格式打印输出到 stdout(标准输出)中,当然,printf 函数是不会一个字符一个字符去输出,它会调用更底层的 I/O 函数:fputc去逐个字符打印。
fputc 也定义于头文件 <stdio.h>中,如下:
int fputc(int ch, FILE *stream);
fputc 函数写入字符 ch 到给定输出流 stream,printf函数在调用该函数时,会向stream参数传入stdout从而打印数据到标准输出。
那么,要实现printf打印到串口就变得非常简单了,只需要重新定义fputc函数,在fputc的函数中将数据通过串口发送,称之为:fputc重定向或者printf重定向。
3.在MDK中使用MicroLib重定向printf(这一步如果不勾选发现printf函数在main函数中还是用不了
勾选MicroLib,该库时对标准C库进行了高度优化之后的库,供MDK默认使用,相比之下,MicroLIB的代码更少,资源占用更少:
在这里插入图片描述
4.关注这个寄存器的bit6:TC,表示当前的发送数据寄存器(TDR)中的8位数据是否研究通过移位寄存器发送完毕。通过该位来确定是否继续发送下一个8位数据:while((USART1->ISR & 0X40) == 0
在这里插入图片描述
在这里插入图片描述
5. 大小8个bit位的发送数据寄存器,如果上一次发送完毕,直接向该寄存器中写入就可以出发下一次发送
USART1->TDR = (uint8_t) ch;
在这里插入图片描述
6.最后实现fputc函数就变的非常简单了,这里我放在usart.c文件的末尾:

/* USER CODE BEGIN 1 */

#if 1
#include <stdio.h>

int fputc(int ch, FILE *stream)
{
//堵塞判断串口是否发送完成
while((USART1->ISR & 0X40) == 0);
//串口发送完成,将该字符发送
USART1->TDR = (uint8_t) ch;
return ch;
}
#endif

/* USER CODE END 1 */

7.参考文档:https://blog.csdn.net/Mculover666/article/details/99842909

  • 22
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值