2013年11月26日 星期二

[STM32] 如何使用Keil內建函數,printf & scanf

printf & scanf 在嵌入式系統來說,都是一個非常好用但奢侈的功能,但為了加速開發時程,往往不會希望花太多時間重寫一個這樣的功能,所以最容易的方式就是直接用。當然要使用這兩個函數必須指定要輸出/輸入到哪個地方,而最常被拿來使用的,就是USART了。在Keil上只要設定以下幾個部分: (以下使用Polling方式)
  • Use MicroLIB
    [Project] -> Options for Target ... -> [Target] -> [Use MicroLIB] 
圖一
  • Implement PUTCHAR_PROTOTYPE & GETCHAR_PROTOTYPE
  • #include <stdio.h>
    #define USART_TYPE        USART1

    #ifdef __GNUC__
      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
      #define GETCHAR_PROTOTYPE int __io_getchar(void)
    #else
      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
      #define GETCHAR_PROTOTYPE int fgetc(FILE *f)
    #endif /* __GNUC__ */

    // Implement
    PUTCHAR_PROTOTYPE
    {
      /* Write a character to the USART */
      USART_SendData(USART_TYPE, (u8) ch);

      /* Loop until the end of transmission */
      while(USART_GetFlagStatus(USART_TYPE, USART_FLAG_TXE) == RESET);
      return ch;
    }

    GETCHAR_PROTOTYPE
    {
       /* Loop until the end of receive */
       while(USART_GetFlagStatus(USART_TYPE, USART_FLAG_RXNE) == RESET);
     
       /* Read a character to the USART */
       return (USART_ReceiveData(USART_TYPE));

    }

  • 主程式 initial usart & 直接使用printf & scanf
  • #include<stdio.h>

    int main()
    {
            uint8_t data;
            USART_Init(); // 注意,記得要啟動要導向裝置
            while(1) {
                   scanf("%c\n",&data);
                   printf("Data = %c",data);
            }
    }

Reference:
[1] 在MDK使用printf&scanf

3 則留言:

  1. 請問 scanf() 是否屬於 polling 方式, 會導致CPU 執行至 scanf() 等待輸入?

    回覆刪除
  2. 這個方法確實是使用polling的方式,由於當初只是為了debug,故並沒有考慮任何的效能問題。

    回覆刪除