回覆列表
  • 1 # EDADOC

    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()函式就可以直接使用了。

  • 2 # 微控制器嵌入式愛好者

    在做程式除錯時,經常需要透過串列埠輸出些資訊,便於觀察和分析。將要輸出的資訊透過printf函式輸出到串列埠也是我們在微控制器程式開發中經常需要的。一般我們有兩種方法將資訊從串列埠打印出來;

    一種是使用重定向功能,使用printf函式將資訊透過串列埠打印出來;一種是使用sprintf功能,將資訊儲存到記憶體,然後再透過串列埠打印出來。

    下面分別對這兩種方法做簡單介紹:

    1.使用printf函式將要列印的資訊從串列埠打印出來

    由於實際printf函式的實現是封裝在MicrolLIB庫裡面的,所以在使用printf的時候要先勾選keil裡面的use MicrolLIB選項,如下圖:

    其次是在串列埠檔案中增加如下程式碼,主要是包含標頭檔案“stdio.h”和重定義函式的實現,程式碼如下:

    這裡使用的是USART2,可以根據自己的實際情況做更改。

    這樣就可以使用printf函式將資訊透過串列埠打印出來了。

    若要實現scanf函式功能,也就是從串列埠獲取字元,那麼可以重定義fgetc函式,這裡先給個截圖參考

  • 中秋節和大豐收的關聯?
  • 想從事兒童美術教育,不知道從哪裡入手,該準備什麼?