OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18502|回复: 25

关于stm32中的printf函数的问题

[复制链接]

30

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-6-14
在线时间
206 小时
发表于 2012-6-14 11:05:39 | 显示全部楼层 |阅读模式
我在使用正点原子的开发板的时候,发现一个问题,就是关于printf直接通过串口打印端口数据的问题,这一点上面我感觉比较的迷惑,这个开发板的串口和printf是如何关联起来的?我在网上也查找了一些解答,但是,在正点兄的开发板上面也没有找到相关的类似的代码,请问一下,版主的这个是如何实现的,如果可以理解了这个过程的话,那么,以后可以通过printf可以非常好的调试方法了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-9-1
在线时间
0 小时
发表于 2014-9-29 16:38:47 | 显示全部楼层
回复【12楼】cc罗罗heaven:
---------------------------------
算了,自己找吧。论坛上我问的几个人基本都没有回复。照抄的日子已经结束了,没有自己的思想永远生活在社会底层。
回复 支持 1 反对 0

使用道具 举报

30

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-6-14
在线时间
206 小时
 楼主| 发表于 2012-6-14 11:07:51 | 显示全部楼层
也就是说,printf如何和硬件串口关联起来的
回复 支持 反对

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
发表于 2012-6-14 11:11:48 | 显示全部楼层
这个你可以用source查看源码之间的关联,你会发现。printf是库函数。串口发送函数 封装起来 的。你看下串口那块。
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复 支持 反对

使用道具 举报

30

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-6-14
在线时间
206 小时
 楼主| 发表于 2012-6-14 11:31:50 | 显示全部楼层
回复【3楼】a4615800:
---------------------------------
恩,我找到了正点原子的代码了,当时还没有怎么注意,谢谢你的提醒,呵呵
代码:
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB   
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

int handle; 
/* Whatever you require here. If the only file you are using is */ 
/* standard output using printf() for debugging, no file handling */ 
/* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
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 
//end
//////////////////////////////////////////////////////////////////
回复 支持 反对

使用道具 举报

30

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-6-14
在线时间
206 小时
 楼主| 发表于 2012-6-14 11:39:53 | 显示全部楼层
这段代码我想以后可以作为模版程序来进行使用了,只要定义到相应的串口就ok了。
回复 支持 反对

使用道具 举报

28

主题

306

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
1320
金钱
1320
注册时间
2012-6-3
在线时间
353 小时
发表于 2012-6-14 12:04:15 | 显示全部楼层
回复【4楼】jiafangshi:
---------------------------------
这段代码不是一般人,能写出来的吧?
回复 支持 反对

使用道具 举报

30

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-6-14
在线时间
206 小时
 楼主| 发表于 2012-6-14 17:25:41 | 显示全部楼层
回复【6楼】艾科:
---------------------------------
恩,上面的代码,我想哈,其实就是通过这里,来重新定义了fputc这个函数,因为printf函数中就是通过
fputc来实现输出的,这里就是相当于重定向了,网上也是有相应的代码,但是至于前面的
#pragma import(__use_no_semihosting)              
//标准库需要的支持函数                  
struct __FILE  
{  
int handle;  
/* Whatever you require here. If the only file you are using is */  
/* standard output using printf() for debugging, no file handling */  
/* is required. */  
};  
/* FILE is typedef’ d in stdio.h. */  
FILE __stdout;        
//定义_sys_exit()以避免使用半主机模式     
_sys_exit(int x)  
{  
x = x;  

我不是很理解其中的意思,呵呵
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-3-19 16:55:12 | 显示全部楼层
回复【7楼】jiafangshi:
---------------------------------
我也不知道  我也再看  你要是了解给我说说啊
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-3-24
在线时间
0 小时
发表于 2014-4-16 11:28:12 | 显示全部楼层
那是不是说我只要把程序中串口1改成其他串口,printf输出的就是通过串口输出的了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-16 14:00:05 | 显示全部楼层
回复【7楼】jiafangshi:
---------------------------------
这个就直接不用管了,照抄就是。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-9-1
在线时间
0 小时
发表于 2014-9-17 20:48:47 | 显示全部楼层
回复【5楼】jiafangshi:
---------------------------------
这段的意思是什么呢??为什么printf()没有定义?
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-8-12
在线时间
1 小时
发表于 2014-9-26 08:08:21 | 显示全部楼层
还有为什么串口调试  没有第一个printf函数的输出“您输入的数据”
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-8-12
在线时间
1 小时
发表于 2014-9-30 23:52:50 | 显示全部楼层
回复【13楼】SimpleSimon:
---------------------------------
不明白唉
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-10-23
在线时间
0 小时
发表于 2015-6-11 16:28:17 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
#if 1
#pragma import(__use_no_semihosting)   

这个 if 1 是啥意思啊?
人之所以能是相信能!
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-10-23
在线时间
0 小时
发表于 2015-6-11 16:30:05 | 显示全部楼层
回复【15楼】一介布衣在江湖:
---------------------------------
感觉是不是需要做判断直接加入代码也行?
人之所以能是相信能!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-11 21:02:23 | 显示全部楼层
回复【15楼】一介布衣在江湖:
---------------------------------
相当于废话。
实际上就是一直成立。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-4-22
在线时间
0 小时
发表于 2015-8-2 20:55:50 | 显示全部楼层
回复【13楼】SimpleSimon:
---------------------------------
兄弟,给你点赞,我也问过一些人,没有回复。把希望寄托在别人身上,就是等死。
不百多别人的束缚,永远也不可能有所作为。
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-1-16
在线时间
7 小时
发表于 2016-1-21 09:41:53 | 显示全部楼层
恩!要有自己的思想
回复 支持 反对

使用道具 举报

8

主题

32

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-12-29
在线时间
19 小时
发表于 2016-12-29 02:50:17 | 显示全部楼层
正点原子 发表于 2014-4-16 14:00
回复【7楼】jiafangshi:
---------------------------------
这个就直接不用管了,照抄就是。

原子哥我想问下如果把这一段代码加到其他串口的定义里面,那是不是printf就由其他的串口输出
回复 支持 反对

使用道具 举报

mrxsean 该用户已被删除
发表于 2016-12-29 10:33:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

8

主题

32

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-12-29
在线时间
19 小时
发表于 2016-12-31 15:07:49 | 显示全部楼层
谢谢大佬,长姿势了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-3-6
在线时间
6 小时
发表于 2017-3-9 15:28:19 | 显示全部楼层
正点原子 发表于 2015-6-11 21:02
回复【15楼】一介布衣在江湖:
---------------------------------
相当于废话。
实际上就是一直成立。

gcc用这个不成,fputc(int) 换成 __io_putchar(int)也不成,求指点
回复 支持 反对

使用道具 举报

9

主题

27

帖子

0

精华

高级会员

Rank: 4

积分
785
金钱
785
注册时间
2016-3-3
在线时间
28 小时
发表于 2017-3-9 15:34:44 | 显示全部楼层
printf函数是库函数,通过调用fputc()实现的串口打印功能,然而这一块代码在这个库里并没有开源
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
        USART1->TDR = (u8) ch;      
        return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2017-9-1
在线时间
1 小时
发表于 2017-9-1 20:44:09 | 显示全部楼层
一介布衣在江湖 发表于 2015-6-11 16:28
回复【10楼】正点原子:
---------------------------------
#if 1
#pragma import(__use_no_semi ...

因为#pragma import(__use_no_semihosting) 这句语句只是在#if到#endif语句段执行的,程序其他地方并不用执行,所以写了一句看似没有用的#if 1
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2017-4-4
在线时间
57 小时
发表于 2017-9-14 21:01:27 | 显示全部楼层
liuyangzys 发表于 2017-3-9 15:28
gcc用这个不成,fputc(int) 换成 __io_putchar(int)也不成,求指点

GCC要用到以下的函数:

int _write(int fd, char* ptr, int len)
{

}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 03:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表