014:針對mdk中STM32程序無法使用printf,產生停留BEAB BKPT 0xAB處問題的解決(轉)


在網上搜了下,發現有很多這樣的問題,我也遇到了,最后解決了,我在此總結一下:

問題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).
的錯誤不知道為什么,希望有知道的能解決一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM