你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口使用Printf()函数问题

[复制链接]
anger0925 发布时间:2015-9-14 11:47
要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.
' d( |" N. X1 g8 P0 a
例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:

#ifdef __GNUC__+ q: f2 J) L) d, C9 N7 E9 _
$ Y- _0 p2 O) G: k$ y( ]
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
1 ?4 p% P$ j( v/ a) g: n' p1 g#else, Z" k9 g3 `2 _1 N7 ~) f' a* I* R
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)4 Z3 ~5 B% {! a3 O$ J6 N
#endif

PUTCHAR_PROTOTYPE6 }: V! y% j4 i3 j- i9 Y
{
7 h! X, {, ]; P# j2 [0 z! @) |$ p& G  i1 T, s' p3 z8 k/ Z( ?$ B' F. B
# U: q% P& |7 |3 S0 \& _2 K7 L2 {
USART_SendData(USART1, (uint8_t) ch);
. Z0 h9 G6 [: D6 K' r, J
) o# F, g" e5 z3 M  }1 Xwhile (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  t3 B( H$ }) o4 Creturn ch;% S. k6 j+ D  H
}

因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法:
方法1.使用微库,因为使用微库的话,不会使用半主机模式.
            如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“这样以后就可以使用printf,sprintf函数了 .
方法2.仍然使用标准库,在主程序添加下面代码:
#pragma import(__use_no_semihosting) //确保没有从 C 库链接使用半主机的函数
% T% @& V" t- i: b% a9 w_sys_exit(int x) //定义_sys_exit()以避免使用半主机模式  Y3 J* P9 n- _; |2 E  d6 \
{
1 @$ c+ \- T( H- U& n, [x = x;
) w% B# f+ A3 L& P: G1 N0 ]} $ c) ]/ U1 l- {: O! {
struct __FILE  //标准库需要的支持函数
" x* ?, ]& A3 v* K; i3 i2 f3 S{
) ]  H- U0 E8 d7 E0 `2 t/ p0 Hint handle;
( |" L; S# r) t# [+ u9 e2 n
, y6 z! a5 z- }+ H4 V" M* t  B$ M3 G
1 ]' b" X+ [( q5 U
}; 1 e' }) W4 `- g- S9 l/ R

! ~" b. P/ g9 f: r/ YFILE __stdout;
在独立应用程序中,您不太可能支持半主机操作。 因此,必须确保您的应用程序中没有链接 C 库半主机函数。为确保没有从 C 库链接使用半主机的函数,必须导入符号 __use_no_semihosting。可在您工程的任何 C 或汇编语言源文件中执行此操作,如下所示:
- X2 N7 U) ^7 Q7 H$ n' K) l" L• 在 C 模块中,使用 #pragma 指令:
/ P& F$ j& S) t( X5 _4 J#pragma import(__use_no_semihosting)
• 在汇编语言模块中,使用 IMPORT 指令:
% C% d6 _" R2 r+ U& Q9 K" |+ qIMPORT __use_no_semihosting ) I; R: Q8 x' Z5 R; v
如果仍然链接了使用半主机的函数,则链接器会报告错误。
2 \# R) p; N2 v. h
赞 收藏 评论2 发布时间:2015-9-14 11:47

举报

2个回答
沐紫 回答时间:2015-9-15 14:00:27
谢谢楼主分享
anger0925 回答时间:2015-9-15 16:15:02
沐紫 发表于 2015-9-15 14:00
- z$ k3 v2 s. h- W- ^  v# z4 C谢谢楼主分享

1 i. q+ {  M- T7 d$ g相互学习  
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版