筆記: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函數,可參考上面的。源碼

相關文章
相關標籤/搜索