在調試過程當中每每須要經過打印來看系統運行狀態;在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函數,可參考上面的。源碼