在網上搜了下,發現有很多這樣的問題,我也遇到了,最后解決了,我在此總結一下:
問題1(與編譯軟件無關):在程序中加入printf語句實現串口輸出,但未寫重定向函數fputc,出現編譯無任何警號和錯誤直接下載無法運行,軟件仿真可以運行至MAIN函數,硬件仿真在匯編窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //進入調試模式”處無法繼續運行。
解決辦法:編寫fputc函數如下:
1 int fputc(int ch, FILE *f) 2 { 3 USART_SendData(USART1, (uint8_t) ch); 4 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) 5 {} 6 return ch; 7 }
問題2(與編譯軟件有關):重定向函數fputc編寫無誤,使用的是MDK4.22-3.40之間的編譯環境,未使用微庫,即MiclroLIB,因printf()之類的函數,使用了半主機模式。使用微庫的話,不會使用半主機模式,所以就沒有問題。
解決辦法:在option for target->target 對話框中,選擇Use MiclroLIB,重新編譯程序即可。
問題3:重定向函數fputc編寫無誤,不用微庫,即MiclroLIB,依然可以使用printf
解決辦法:
在程序中加入如下語句:
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;
此代碼功能用於避免使用semhosting(半主機模式)
問題4:使用的是MDK4.22-3.40之間的編譯環境,不想使用微庫,也不想加入問題三語句。
解決辦法:
更換低版本的MDK,3.4以下吧,本人試驗使用mdk3.24不勾選MiclroLIB,也不加入問題三語句,能夠正常使用printf,無任何問題。
這是我遇到問題后找到的解決辦法。如有問題請大家指正。還有一個問題沒有解決就是選擇Use MiclroLIB后編譯出錯,提示如下:
.\Obj\XXXX.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from stm32f10x_startup.o).
.\Obj\XXXX.axf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).
的錯誤不知道為什么,希望有知道的能解決一下。