回覆列表
-
1 # EDADOC
-
2 # 微控制器嵌入式愛好者
在做程式除錯時,經常需要透過串列埠輸出些資訊,便於觀察和分析。將要輸出的資訊透過printf函式輸出到串列埠也是我們在微控制器程式開發中經常需要的。一般我們有兩種方法將資訊從串列埠打印出來;
一種是使用重定向功能,使用printf函式將資訊透過串列埠打印出來;一種是使用sprintf功能,將資訊儲存到記憶體,然後再透過串列埠打印出來。下面分別對這兩種方法做簡單介紹:
1.使用printf函式將要列印的資訊從串列埠打印出來由於實際printf函式的實現是封裝在MicrolLIB庫裡面的,所以在使用printf的時候要先勾選keil裡面的use MicrolLIB選項,如下圖:
其次是在串列埠檔案中增加如下程式碼,主要是包含標頭檔案“stdio.h”和重定義函式的實現,程式碼如下:
這裡使用的是USART2,可以根據自己的實際情況做更改。
這樣就可以使用printf函式將資訊透過串列埠打印出來了。
若要實現scanf函式功能,也就是從串列埠獲取字元,那麼可以重定義fgetc函式,這裡先給個截圖參考
1.首先在KEIL-MDK中選擇Use MicroLIB選項
MicroLib是預設c庫的備選庫,提供了一個有限的stdio子系統,它僅支援未緩衝的stdin、stdout和stderr,那麼也就是說勾選了Use MicroLib選項後,在程式碼工程中就可以使用printf()函式,然而這樣直接使用printf()函式,其列印的字串最終不知道列印到何處。我們要做的是將除錯資訊列印到USART1中,所以需要對printf()函式所依賴的列印輸出函式fputc()重定向(MicroLib中的printf()函式列印操作依賴fputc())。
2 重定向fputc函式
在MicroLib的stdio.h中,fputc()函式的原型為:
int fputc(int ch, FILE* stream)
此函式原本是將字元ch列印到檔案指標stream所指向的檔案流去的,現在我們不需要列印到檔案流,而是列印到串列埠1。基於前面的程式碼:
#include <stdio.h>
int fputc(int ch, FILE* stream)
{
//USART_SendData(USART1, (unsigned char) ch);
//while (!(USART1->SR & USART_FLAG_TXE));
USART_SendChar(USART1, (uint8_t)ch);
return ch;
}
注意,需要包含標頭檔案stdio.h,否則FILE型別未定義。
勾選了Use MicroLib選項,重定向fputc()函式後,我們就可以在工程程式碼中使用printf()函數了:
int main(void)
{
USART_Configuration();
printf("\r\nstm32f103\r\n");
printf("\r\nCortex-M3\r\n");
while (1);
return 0;
}
printf()函式就可以直接使用了。