用CCS分析解讀CC3200 SDK工具包的UART示例程式

研究僧-彬彬發表於2020-10-30

序列介面分為非同步介面和同步介面兩種。非同步序列介面統稱為通用非同步收發器(UART)介面,同步序列介面有SPI和I2C等,同步序列介面包含資料線和時鐘線,主裝置和從裝置的時鐘必須保持一致,而非同步通訊的主裝置和從裝置的時鐘不一定要一致。

  • SPI有兩根單向資料線MISO和MOSI,時鐘線SCK;
  • I2C有一根雙向資料線SDA,時鐘線SCL;
  • SPI和I2C都可以連線多個從裝置,但SPI通過硬體實現選擇,I2C通過軟體實現選擇;

RS-233C是UART最常用序列通訊標準,採用的是TTL正邏輯,和TTL器件連線不需要電平轉換。和採用負邏輯的計算機相連需要UART-USB轉換器進行電平轉換。從以下CC3200的功能框圖可以看出CC3200 launch開發板是自帶型號為FT2232的USB-UART轉換器的,不需要我們另外加。
在這裡插入圖片描述
CC3200包含兩個可程式設計的UART介面,UARTA0和UARTA1,實物圖如下圖。


在這裡插入圖片描述
上圖是CC3200 LaunchPad電路圖,URATA0的TX口和RX口經過電平轉換電路74LVC1T45和UART-USB轉換電路FT2232D轉換後,通過USB介面與PC相連。

  1. UART示例程式在SDK的examples檔案當中的Uart_demo工程,參照
    文章匯入CCS。
    在這裡插入圖片描述
  • main.c:主程式檔案。
  • pinmux.c:引腳配置檔案。
  • uart_if.c:UART介面驅動程式檔案。
  • startup_css.c:CCS啟動程式檔案。
    專案程式流程圖如下圖。
    在這裡插入圖片描述
  1. 進入Debug除錯介面,點選執行,並且開啟Tera Term軟體,選擇CC3200對應的埠。
    在這裡插入圖片描述

Tera Term是來自國外的一款介面簡潔,功能實用的串列埠除錯工具。它是Microsoft Windows的終端模擬器,支援串列埠,遠端登入和SSH連線,內建的巨集指令碼語言。Tera Term通常用於自動執行與從PC發起的遠端連線相關的任務。

具體下載流程可參考連結: teraterm–一款超好用堪比MobaXterm的遠端終端連線軟體,能解決shell端tab鍵等自動補全命令功能的缺失問題.
最終顯示結果如下圖。
在這裡插入圖片描述

主函式

void main()
{
    char cString[MAX_STRING_LENGTH+1];
    char cCharacter;
    int iStringLength = 0;
    //
    // Initailizing the board
    //
    BoardInit();
    //
    // Muxing for Enabling UART_TX and UART_RX.
    //
    PinMuxConfig();
    //
    // Initialising the Terminal.
    //
    InitTerm();
    //
    // Clearing the Terminal.
    //
    ClearTerm();
    DisplayBanner(APP_NAME);
    Message("\t\t****************************************************\n\r");
    Message("\t\t\t        CC3200 UART Echo Usage        \n\r");
    Message("\t\t Type in a string of alphanumeric characters and  \n\r");
    Message("\t\t pressenter, the string will be echoed. \n\r") ;
    Message("\t\t Note: if string length reaches 80 character it will \n\r");
    Message("\t\t echo the string without waiting for enter command \n\r");
    Message("\t\t ****************************************************\n\r");
    Message("\n\n\n\r");
    Message("cmd#");
    while(1)
    {
        //
        // Fetching the input from the terminal.
        //
        cCharacter = UartGetChar();
        g_iCounter++;
        if(cCharacter == '\r' || cCharacter == '\n' ||
           (iStringLength >= MAX_STRING_LENGTH -1))
        {
            if(iStringLength >= MAX_STRING_LENGTH - 1)
            {
                UartPutChar(cCharacter);
                cString[iStringLength] = cCharacter;
                iStringLength++;
            }
            cString[iStringLength] = '\0';
            iStringLength = 0;
            //
            // Echoes the input string
            //
            Report("\n\rcmd#%s\n\rcmd#", cString);
        }
        else
        {
            UartPutChar(cCharacter);
            cString[iStringLength] = cCharacter;
            iStringLength++;
        }
    }
}

工程函式解析

  1. 函式引用關係整理
    綠色框圖代表的是SDK工具包提供的庫函式,這是已經封裝好的函式,只要匯入標頭檔案和相關驅動檔案就可以直接引用。藍色函式是新定義的函式,從圖中可以很明顯看出,整個工程也就三個新定義的函式,一個是主函式,一個是DisBanner函式,一個是引腳複用配置函式(可用PinMux軟體直接生成)。所以大家一定要熟練引用庫函式,不要走了冤枉路,這樣可以節省大量開發的時間。
    在這裡插入圖片描述
  2. 初始化開發板BoardInit()
    具體內容和Bliny專案相同,在此不多贅述。
  3. 引腳複用配置PinMuxConfig()
    引腳複用配置函式可以由PinMux軟體直接生成。
  4. 終端操作
  • 初始化終端
  • 清除終端
  • 顯示標題
  • 顯示字串
    (1)初始化終端函式(API函式)
void InitTerm()//初始化終端函式
{
#ifndef NOTERM
  MAP_UARTConfigSetExpClk(CONSOLE,MAP_PRCMPeripheralClockGet(CONSOLE_PERIPH), 
                  UART_BAUD_RATE, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                   UART_CONFIG_PAR_NONE));
#endif
  __Errorlog = 0;
}
//MAP_PRCMPeripheralClockGet函式獲取外設時鐘
//MAP_UARTConfigSetExpClk函式配置UART介面

(2)清除終端函式(API函式)

void 
ClearTerm()//清除終端函式
{
    Message("\33[2J\r");
}

void 
Message(const char *str)
{
#ifndef NOTERM
    if(str != NULL)
    {
        while(*str!='\0')
        {
            MAP_UARTCharPut(CONSOLE,*str++);
        }
    }
#endif
}

(3)顯示標題函式
這個函式其實就是連續輸出5行文字,用作標題,其實直接寫在主函式也行。

轉義字元意義
\t水平製表(HT) (跳到下一個TAB位置)
\n換行(LF) ,將當前位置移到下一行開頭
\r回車(CR) ,將當前位置移到本行開頭
static void
DisplayBanner(char * AppName)//顯示標題函式
{
    Report("\n\n\n\r");
    Report("\t\t *************************************************\n\r");
    Report("\t\t        CC3200 %s Application       \n\r", AppName);
    Report("\t\t *************************************************\n\r");
    Report("\n\n\n\r");
}

(4)顯示格式字串/字串函式(API函式)
筆者看來,格式字串就是帶著%s、%f具備可變的字元變數的字串,而字串就是普通的字串,是固定的文字,不會存在變數,這就是兩者函式的區別。這兩個函式都是庫函式,在引用的時候注意有所區別就好。

void 
Message(const char *str) //顯示字串函式
{
#ifndef NOTERM
    if(str != NULL)
    {
        while(*str!='\0')
        {
            MAP_UARTCharPut(CONSOLE,*str++);
        }
    }
#endif
}
int Report(const char *pcFormat, ...)//顯示格式字串函式
{
 int iRet = 0;
#ifndef NOTERM

  char *pcBuff, *pcTemp;
  int iSize = 256;
 
  va_list list;
  pcBuff = (char*)malloc(iSize);
  if(pcBuff == NULL)
  {
      return -1;
  }
  while(1)
  {
      va_start(list,pcFormat);
      iRet = vsnprintf(pcBuff,iSize,pcFormat,list);
      va_end(list);
      if(iRet > -1 && iRet < iSize)
      {
          break;
      }
      else
      {
          iSize*=2;
          if((pcTemp=realloc(pcBuff,iSize))==NULL)
          { 
              Message("Could not reallocate memory\n\r");
              iRet = -1;
              break;
          }
          else
          {
              pcBuff=pcTemp;
          }
          
      }
  }
  Message(pcBuff);
  free(pcBuff);
  
#endif
  return iRet;
}

(5)UART接收字元函式(API函式)

long
UARTCharGet(unsigned long ulBase)//UART接收字元函式
{
    //
    // Check the arguments.
    //
    ASSERT(UARTBaseValid(ulBase));

    //
    // Wait until a char is available.
    //
    while(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE)
    {
    }

    //
    // Now get the char.
    //
    return(HWREG(ulBase + UART_O_DR));
}

(6)回顯接收字元函式(API函式)

void
UARTCharPut(unsigned long ulBase, unsigned char ucData)//回顯接收字元函式
{
    //
    // Check the arguments.
    //
    ASSERT(UARTBaseValid(ulBase));

    //
    // Wait until space is available.
    //
    while(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF)
    {
    }

    //
    // Send the char.
    //
    HWREG(ulBase + UART_O_DR) = ucData;
}

參考文獻:《ARM Cortex-M4+Wi-Fi MCU應用指南-CC3200 CCS基礎篇》郭書軍編著 電子工業出版社

相關文章