OpenEdv-开源电子网

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

求嵌入式编程中printf函数的使用介绍!

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2011-2-9
在线时间
0 小时
发表于 2011-2-19 09:40:16 | 显示全部楼层 |阅读模式
前两天在stm32上写了一个串口发送字符的程序,在keil中重写了fputc(),但是调试时不能运行,网上查阅后有篇文章是这样写的:
有没有系统一点介绍嵌入式中printf的使用方法呢?还有keil中怎么添加微库,有没有微库的资料?

标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.

例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE
{
 /* Place your implementation of fputc here */
 /* e.g. write a character to the USART */
 USART_SendData(USART1, (uint8_t) ch);
 /* Loop until the end of transmission */
 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
 return ch;
}

因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法:

方法1.使用微库,因为使用微库的话,不会使用半主机模式.

方法2.仍然使用标准库,在主程序添加下面代码:

#pragma import(__use_no_semihosting) 
_sys_exit(int x) 

x = x; 

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;

初学啊!请多指教!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-2-19 12:10:07 | 显示全部楼层
回复【楼主位】 传说杨哥 :
-------------------------------
使用微库,如下图,选中use microlib即可:


另外,如果不想用微库,可以参考我的串口例程,里面的代码支持printf的。


我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2011-2-9
在线时间
0 小时
 楼主| 发表于 2011-2-19 12:13:24 | 显示全部楼层
谢谢!知道了!
你的代码其实我早看了!里面多了一个
_sys_exit(int x) 

x = x; 

和上面那个方法二一样!可是我不知道这个函数有什么作用,有没有这方面的资料?英文也行
初学啊!请多指教!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-2-19 12:32:42 | 显示全部楼层
回复【3楼】 传说杨哥 :
-------------------------------
这我真还不知道,完全copy别人的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2011-2-9
在线时间
0 小时
 楼主| 发表于 2011-2-19 20:17:34 | 显示全部楼层
3q!受教了!
不过我的jtag好像不太稳定,每次一上电第一次调试都是好的,等退出调试后再次调试目标板就没反应了,其他也没什么异常,给目标板和jtag重新上电后又一切正常,但是第二次进入debug又不行了,搞得我现在调程序很麻烦
初学啊!请多指教!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-2-19 21:41:35 | 显示全部楼层
回复【5楼】传说杨哥:
-------------------------------
不至于吧。JTAG一般都很稳定啊。
你说的调试后退出就没反应了,具体什么现象?无法连接JTAG?还是无法找到STM32?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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