[应用相关] stm32 printf重定向到UART疑点解析

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


 楼主| antusheng 发表于 2020-4-24 23:20 | 显示全部楼层
方案二 使用默认C库:
  这种方案要注意一点,程序不能使用半主机模式,据说半主机模式是STM32的默认模式,用调试器时会用到,所以在程序中要明确加上以下语句
  1. #pragma import(__use_no_semihosting)  
  2. _sys_exit(int x)  
  3. {  
  4.     x = x;  
  5. }  
  6. struct __FILE  
  7. {  
  8. int handle;  
  9. /* Whatever you require here. If the only file you are using is */  
  10. /* standard output using printf() for debugging, no file handling */  
  11. /* is required. */  
  12. };  
  13. /* FILE is typedef’ d in stdio.h. */  
  14. FILE __stdout;
然后再重写putchar函数,可参考上面的。

xiaoqizi 发表于 2020-5-9 14:34 | 显示全部楼层
非常感谢楼主分享
磨砂 发表于 2020-5-9 14:35 | 显示全部楼层
请问什么叫重定向
晓伍 发表于 2020-5-9 14:35 | 显示全部楼层
好像用的是库函数?
八层楼 发表于 2020-5-9 14:35 | 显示全部楼层
长知识了 谢谢楼主
观海 发表于 2020-5-9 14:36 | 显示全部楼层
还是习惯看C库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

1521

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部

86

主题

1521

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部