之前使用printf 都很順利,
程序能夠很天然地經過
串口
輸出字符串,最近使用printf時,程序老是進不去,就是連MAIN
函數都不會執行了,只要把printf屏蔽了,
軟件就能夠正常運行
使用的是
STM32
芯片
仿真的時候程序就是一直在:
0x08002628 BEAB BKPT 0xAB0,
動都不動
這個問題的解決辦法是:
在項目
設置中 選擇 target選項卡 而後選擇 USE Mcrolib 這樣就能夠了
就是說要用printf函數時要用"Use MicroLIB"庫,即: C 微庫(microlib)
還有一種方法:
標準庫函數的默認輸出設備是顯示器,要實如今串口或LCD輸出,必須重
定義標準庫函數裏調用的與輸出設備相關的函數,printf輸出到串口,只需將putc裏面的輸出指向串口就行,另外在使用標準庫函數時必須避免半主機
模式,方法是在main
文件里加
代碼:_sys_exit(int x)
{
x = x;
}
可是在使用時務必注意,正常狀況下以上兩種方法都能解決問題,若是仍是解決不了就要檢查你的程序中有什麼其餘的代碼影響了,
個人狀況是,單獨打印徹底正常,一加到個人其餘程序中就會停在
0x08002628 BEAB BKPT 0xAB0, 這個地方,後來才發現,個人main.c中
有一個條件
編譯
#ifdef USE_FULL_ASSERT
以下:
- #ifdef USE_FULL_ASSERT
- /**
- * @br
- ief 當程序出錯時,返回出錯的文件名及在源程序中的行號.
- * @param file: 指向文件名的指針
- * @param line: 在源程序中的行號
- * @retval : None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* 用戶能夠在此根據須要添加內容,例如報告出錯的文件名和行號,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* 無限循環 */
- while (1)
- {
- }
- }
- #endif
而我把下面一段代碼放錯位置了
- /*******************************************************************************
- * Function Name : PUTCHAR_PROTOTYPE
- * Description : Retargets the C library printf function to the USART.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- PUTCHAR_PROTOTYPE
- {
- /* Write a character to the USART */
- USART_SendData(USART1, (u8) ch);
- /* Loop until the end of transmission */
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {
- }
- return ch;
- }
把上面的代碼放在了 #ifdef USE_FULL_ASSERT ................................. #endif 中間了,而 USE_FULL_ASSERT 又沒有定義過,因此出現了無法解決的問題,在這裏提醒你們注意,遇到問題必定要認真的檢查了!