打印
[应用相关]

stm32 printf重定向到UART疑点解析

[复制链接]
738|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在调试过程中往往需要通过打印来看系统运行状态;在STM32平台上,打印重定向有多种实现方案;其一是编译时使用keil自带的MacroLIB,据说这个库对一些C语言基础设施做了新的实现,代码结构更加紧凑;但这种库没法取得源码,所以就不能进一步研究具体怎么实现的,很遗憾;还有一种实现方案是使用标准C(I/O)库,但这种方式下要注意修改避免使用semihosting(半主机模式),下面对两种方案做以简单说明。
方案一 使用mcrolib库:
  1、首先在option里边勾选mcrolib
  
  2、重写putchar函数,已验证,如果使用当前库,printf会调用putchar;换句话说就是printf的具体实现会调用putchar
/// 重定向printf到uart
int fputc(int ch, FILE *f)
{
  //发送一字节数据到UART<br>     ch = 0x0a;
  USART_SendData(macUSARTx, (uint8_t) ch);
  //检测UART状态
  while (USART_GetFlagStatus(macUSARTx, USART_FLAG_TXE) == RESET);      
   
  return (ch);
}
3、在使用printf之前初始化UART,之后调用即可。效果如下:


使用特权

评论回复
沙发
antusheng|  楼主 | 2020-4-24 23:20 | 只看该作者
方案二 使用默认C库:
  这种方案要注意一点,程序不能使用半主机模式,据说半主机模式是STM32的默认模式,用调试器时会用到,所以在程序中要明确加上以下语句
#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;
然后再重写putchar函数,可参考上面的。

使用特权

评论回复
板凳
xiaoqizi| | 2020-5-9 14:34 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
地板
磨砂| | 2020-5-9 14:35 | 只看该作者
请问什么叫重定向

使用特权

评论回复
5
晓伍| | 2020-5-9 14:35 | 只看该作者
好像用的是库函数?

使用特权

评论回复
6
八层楼| | 2020-5-9 14:35 | 只看该作者
长知识了 谢谢楼主

使用特权

评论回复
7
观海| | 2020-5-9 14:36 | 只看该作者
还是习惯看C库

使用特权

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

本版积分规则

83

主题

1470

帖子

5

粉丝