笔记:stm32 printf重定向到UART疑点解析

  在调试过程当中每每须要经过打印来看系统运行状态;在STM32平台上,打印重定向有多种实现方案;其一是编译时使用keil自带的MacroLIB,听说这个库对一些C语言基础设施作了新的实现,代码结构更加紧凑;但这种库无法取得源码,因此就不能进一步研究具体怎么实现的,很遗憾;还有一种实现方案是使用标准C(I/O)库,但这种方式下要注意修改避免使用semihosting(半主机模式),下面对两种方案作以简单说明。函数

  方案一 使用mcrolib库:ui

  一、首先在option里边勾选mcrolibspa

  

  二、重写putchar函数,已验证,若是使用当前库,printf会调用putchar;换句话说就是printf的具体实现会调用putchardebug

  /// 重定向printf到uart
  int fputc(int ch, FILE *f)
  {
	//发送一字节数据到UART
     ch = 0x0a; USART_SendData(macUSARTx, (uint8_t) ch); //检测UART状态 while (USART_GetFlagStatus(macUSARTx, USART_FLAG_TXE) == RESET); return (ch);   }

  三、在使用printf以前初始化UART,以后调用便可。效果以下:调试

  

  方案二 使用默认C库:code

  这种方案要注意一点,程序不能使用半主机模式,听说半主机模式是STM32的默认模式,用调试器时会用到,因此在程序中要明确加上如下语句blog

#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函数,可参考上面的。源码

相关文章
相关标签/搜索