stm32中关于重定义printf的函数是不是只要把usart printf1改成其他的比如usart printf2就可以用

照片风格各异,时而腾空跃起,时而单手托举。
暴雨把房屋淹没,因为走得着急,40万借条没来得及拿。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  网上讲的添加printf()到程序中一般都是这样的(简要提一下):
  1.配置GPIO ,USART,RCC 的Configuration
  2.勾选usb micro lib
  3.在程序中添加:(头文件需要添加#include &stdio.h&)
  #ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  #endif
  PUTCHAR_PROTOTYPE
  USART_SendData(USART1, (u8) ch);
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  很明显这个方法使用printf()只能输出到usart1,如果需要使用多个usart呢,肯定不能都是用printf()。
  方法如下是继续是用usart2的printf()功能:
  1.配置usart2的串口配置,gpio,enable,跟上面类似
  2.勾选usb micro lib,跟上面类似
  3.添加头文件#include &stdarg.h&,编写USART2的printf函数:
  void USART2_printf (char *fmt, ...)
  char buffer[CMD_BUFFER_LEN+1]; // CMD_BUFFER_LEN长度自己定义吧
  u8 i = 0;
  va_list arg_
  va_start(arg_ptr, fmt);
  vsnprintf(buffer, CMD_BUFFER_LEN+1, fmt, arg_ptr);
  while ((i & CMD_BUFFER_LEN) && buffer)
  USART_SendData(USART2, (u8) buffer[i++]);
  while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  va_end(arg_ptr);
  原文链接:
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
电子工程世界(EEWorld)是一家专为中国电子工程师和电...
13723文章数
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:后使用快捷导航没有帐号?
查看: 1424|回复: 6
stm32 printf函数实现方法
在线时间79 小时
芯币368 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义&fputc&函数 如下:
// 发送数据
int fputc(int ch, FILE *f)
USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
while (!(USART1-&SR & USART_FLAG_TXE));
return (ch);
// 接收数据
int GetKey (void) {
while (!(USART1-&SR & USART_FLAG_RXNE));
return ((int)(USART1-&DR & 0x1FF));
这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target& -& &Code Generation& 选项中勾选 &Use MicroLIB&”
MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。
至此完成配置,在工程中可以随意使用printf向串口发送数据了。
<p id="rate_593" onmouseover="showTip(this)" tip="赞一个!&威望 + 4 分
芯币 + 4 枚
" class="mtn mbn">
&&&&&&&&&&
在线时间79 小时
芯币368 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
谁能解释一下为什么要定义
// 接收数据
int GetKey (void) {
while (!(USART1-&SR & USART_FLAG_RXNE));
return ((int)(USART1-&DR & 0x1FF));
接受数据时用不到printf函数啊?
顾名思义,接收数据用的呗&
在线时间59 小时
芯币235 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 60, 距离下一级还需 140 积分
一粒金砂(中级), 积分 60, 距离下一级还需 140 积分
谁能解释一下为什么要定义
// 接收数据
顾名思义,接收数据用的呗
在线时间922 小时
威望2457 分
芯币11914 枚
E金币717 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2457, 距离下一级还需 1043 积分
五彩晶圆(初级), 积分 2457, 距离下一级还需 1043 积分
今天我也在好奇在常见环境下的printf函数,现在也还是一知半解,按理说你把fputc函数重定向就能发送了,你说如果不重定向GetKey函数就不行?
我也是新手,不过我试了一下,不重定义GetKey也可以收发数据……&
在线时间2039 小时
威望13822 分
芯币27815 枚
E金币39 枚
TA的帖子TA的资源
没明白什么问题,两个重定向是否要一起才行,试试就可以了。。。。
试过了,没必要一起重定义&
在线时间79 小时
芯币368 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
今天我也在好奇在常见环境下的printf函数,现在也还是一知半解,按理说你把fputc函数重定向就能发送了,你 ...
我也是新手,不过我试了一下,不重定义GetKey也可以收发数据……
在线时间79 小时
芯币368 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
一粒金砂(中级), 积分 14, 距离下一级还需 186 积分
没明白什么问题,两个重定向是否要一起才行,试试就可以了。。。。
试过了,没必要一起重定义
Powered by
逛了这许久,何不进去瞧瞧?二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我每天都在奋斗着,奋斗……
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3709)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'怎么解决STM32(MDK)中不能使用printf()函数的问题',
blogAbstract:'简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式),标准库函数的默认输出设备是显示器,要实现在串口或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',
blogTag:'stm32,mdk,printf,重定向',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:3,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我每天都在奋斗着,奋斗……',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}STM32&重定义printf导致无法… - 博客频道 - CSDN.NET
effort0806222的博客
最近在调试STM32时,总是发现跳不到Main函数,我在Debug模式下,全速运行时,很快就会停止。看汇编程序,发现在跳到Main函数时,此时地址不对(没有对齐)。忙了很久,才发现原来这是因为我移值printf函数时,出现的问题。在移植printf函数时需移植fputc函数,如下:
int fputc(int ch,FILE *f)
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(RS232,USART_FLAG_TC)==RESET)&&&&&&&&&&//重定向到RS232口---USART2
在裸奔时,移植这些就可以了,我调试printf,没有发现任何问题。但当我把她移植的uCOSII(V
2.86)上时,就出现了上面的问题。在网上搜了下,发现了博友的一片博文中提到。解决方法如下:
使用了printf之类的库函数,需要编写_sys_exit()之类底层函数。_sys_xxx之类的的只要写个空函数就行了。
因printf()之类的函数,使用了半主机模式。使用微库的话,不会使用半主机模式,所以就没有问题。&
添加下面代码,就可以使用标准库了:&
#pragma&import(__use_no_semihosting)&
_sys_exit(int&x)&
struct&__FILE&
以上问题可在在"RealView?&编译工具库和浮点支持指南"书中找到。
effort0806222
排名:千里之外
(19)(0)(3)(1)7040人阅读
C/C++开发(7)
STM32学习之路(1)
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)
标签: &STM32 &串口通信 &printf方法 & 23:29&
在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。
下面就说一下使用printf需要做哪些配置。
有两种配置方法:
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义&fputc&函数 & &如下:
& &// 发送数据
& &int fputc(int ch, FILE *f)
& & & USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
& & & while (!(USART1-&SR & USART_FLAG_TXE));
& & & return (ch);
& &// 接收数据
& &int GetKey (void) &{&
& & & while (!(USART1-&SR & USART_FLAG_RXNE));
& & & return ((int)(USART1-&DR & 0x1FF));
& &这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target& -& &Code Generation& 选项中勾选 &Use MicroLIB&”&
& &MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。
至此完成配置,在工程中可以随意使用printf向串口发送数据了。
二、第二种方法是在工程中添加“Regtarge.c”文件
1、在main文件中包含 “stdio.h” 文件
2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中
在文件中输入如下内容(直接复制即可)
#include &stdio.h&
#include &rt_misc.h&
#pragma import(__use_no_semihosting_swi)
extern int &SendChar(int ch); // 声明外部函数,在main文件中定义
extern int &GetKey(void);
struct __FILE {
& & & & & & & & & // Add whatever you need here&
int fputc(int ch, FILE *f) {
& return (SendChar(ch));
int fgetc(FILE *f) {
& return (SendChar(GetKey()));
void _ttywrch(int ch) {
&SendChar (ch);
int ferror(FILE *f) { & & & & & & & & & & & & & &// Your implementation of ferror
& return EOF;
void _sys_exit(int return_code) {
label: & & & & & & // endless loop
3、在main文件中添加定义以下两个函数
int SendChar (int ch) &{
& while (!(USART1-&SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口
& USART1-&DR = (ch & 0x1FF);
& return (ch);
int GetKey (void) &{
& while (!(USART1-&SR & USART_FLAG_RXNE));
& return ((int)(USART1-&DR & 0x1FF));
至此完成配置,可以在main文件中随意使用 printf 。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:152873次
积分:1848
积分:1848
排名:第14718名
原创:25篇
转载:68篇
评论:25条
(3)(10)(24)(21)(5)(3)(2)(14)(4)(7)

我要回帖

更多关于 stm32 usart2 的文章

 

随机推荐