[开发工具]

Stm32 - Printf重定向(不)使用微库(Keil MDK)

[复制链接]
3018|24
手机看帖
扫描二维码
随时随地手机跟帖
rosemoore|  楼主 | 2021-8-15 13:32 | 显示全部楼层 |阅读模式
Stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~

方法1--使用微库:

1、使用微库(平台式keil-MDK),点击“魔术棒” Target标签下有个Use MicroLIB---勾选。
2、包含头文件:#include "stdio.h"
3、Printf重定向,修改fputc()函数的内容~
int fputc(int ch, FILE *f)
{
USART_SendData(DEBUG_USART, (unsigned char) ch);
while (!(DEBUG_USART->SR & USART_FLAG_TXE));
return (ch);
}
这里的:USART_SendData(DEBUG_USART, (unsigned char) ch);
while (!(DEBUG_USART->SR & USART_FLAG_TXE));
就是往串口发送一个字节的代码,修改相应的串口,初始化。这样就能使用printf了~可以一试。
方法2--不使用微库(那么就要强调不使用半主机(no semihosting)模式)
1、包含头文件#include "stdio.h"
2、重写fputc,但需要先加点东西:
#pragma import(__use_no_semihosting)
_sys_exit(int x)
{
x = x;
}

struct __FILE
{
int handle;
};

FILE __stdout;

int fputc(int ch, FILE *f)
{
USART_SendData(DEBUG_USART, (unsigned char) ch);
while (!(DEBUG_USART->SR & USART_FLAG_TXE));
return (ch);
}

这样,就完成了,同样可以使用printf语句了~

使用特权

评论回复
Bobby13| | 2021-8-15 18:24 | 显示全部楼层
可以自己撸一个 xprintf,参考:
https://gitee.com/eegithub/xprintf_demo
https://gitee.com/suanite/xprintf
https://gitee.com/swabc/ChaN_xprintf

都来源于:
http://elm-chan.org/fsw/strf/xprintf.html
http://elm-chan.org/fsw/ff/00index_e.html

使用特权

评论回复
呐咯密密| | 2021-8-25 17:29 | 显示全部楼层
很实用,感谢分享之前就遇到过这个问题

使用特权

评论回复
redone| | 2021-8-26 13:29 | 显示全部楼层
这两种,我都见过,
之前只是知道这样就能用了
今天才知道所以然~~

使用特权

评论回复
隐去| | 2021-8-27 13:57 | 显示全部楼层
感谢分享

使用特权

评论回复
kkzz| | 2021-9-1 21:12 | 显示全部楼层
printf()怎么重定向?  

使用特权

评论回复
hudi008| | 2021-9-1 21:12 | 显示全部楼层
把 原来的 cout 向屏幕输出 改为输出到文件。   

使用特权

评论回复
lzmm| | 2021-9-1 21:12 | 显示全部楼层
需要重定向fputc函数   

使用特权

评论回复
minzisc| | 2021-9-1 21:13 | 显示全部楼层
必须重定义标准库函数里调用的与输出设备相关的函数

使用特权

评论回复
selongli| | 2021-9-1 21:13 | 显示全部楼层
调用MDK微库(MicroLib)的方法  

使用特权

评论回复
fentianyou| | 2021-9-1 21:13 | 显示全部楼层
重写int fputc(int ch, FILE *f)函数  

使用特权

评论回复
xiaoyaodz| | 2021-9-1 21:14 | 显示全部楼层
重定义fputc函数吧   

使用特权

评论回复
febgxu| | 2021-9-1 21:14 | 显示全部楼层
这个经常用到的。   

使用特权

评论回复
sdlls| | 2021-9-1 21:15 | 显示全部楼层
#include "stdio.h"才是最重要的。

使用特权

评论回复
pixhw| | 2021-9-1 21:15 | 显示全部楼层
可以自己写这个代码吗   

使用特权

评论回复
lzmm| | 2021-9-1 21:15 | 显示全部楼层
让字符串数据输出到指定串口  

使用特权

评论回复
hudi008| | 2021-9-1 21:15 | 显示全部楼层
以使用USART_SendData(USART1, (uint8_t) ch);  

使用特权

评论回复
kkzz| | 2021-9-1 21:16 | 显示全部楼层
printf本身没有重定向吧  

使用特权

评论回复
pixhw| | 2021-9-1 21:16 | 显示全部楼层
例如填写一些自己的数据。  

使用特权

评论回复
sdlls| | 2021-9-1 21:16 | 显示全部楼层
#include "stdio.h"不包含这个头文件会报错的。  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

1110

帖子

2

粉丝