用CCS分析解讀CC3200 SDK工具包的UART示例程式
序列介面分為非同步介面和同步介面兩種。非同步序列介面統稱為通用非同步收發器(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相連。
- UART示例程式在SDK的examples檔案當中的Uart_demo工程,參照
文章匯入CCS。
- main.c:主程式檔案。
- pinmux.c:引腳配置檔案。
- uart_if.c:UART介面驅動程式檔案。
- startup_css.c:CCS啟動程式檔案。
專案程式流程圖如下圖。
- 進入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++;
}
}
}
工程函式解析
- 函式引用關係整理
綠色框圖代表的是SDK工具包提供的庫函式,這是已經封裝好的函式,只要匯入標頭檔案和相關驅動檔案就可以直接引用。藍色函式是新定義的函式,從圖中可以很明顯看出,整個工程也就三個新定義的函式,一個是主函式,一個是DisBanner函式,一個是引腳複用配置函式(可用PinMux軟體直接生成)。所以大家一定要熟練引用庫函式,不要走了冤枉路,這樣可以節省大量開發的時間。
- 初始化開發板BoardInit()
具體內容和Bliny專案相同,在此不多贅述。 - 引腳複用配置PinMuxConfig()
引腳複用配置函式可以由PinMux軟體直接生成。 - 終端操作
- 初始化終端
- 清除終端
- 顯示標題
- 顯示字串
(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基礎篇》郭書軍編著 電子工業出版社
相關文章
- 用CCS分析解讀CC3200 SDK工具包的PWM示例程式
- 深入解讀-微信小程式SDK微信小程式
- Windows SDK程式設計之一 視窗示例程式 (轉)Windows程式設計
- 《Sencha應用程式的UI測試 》一文的示例分析 薦UI
- Air724UG軟體UART示例:序列通訊的智慧導航AI
- UART
- PHP8 新特性解讀和示例PHP
- 史上最詳細ConvLstm的pytorch程式碼解讀分析PyTorch
- Halcon斑點分析官方示例講解
- 解讀tensorflow之rnn 的示例 ptb_word_lm.pyRNN
- NPOI讀取示例
- RTX下IK220計數卡的PCI示例程式碼,自己分析用
- Lift, Splat, Shoot, LSS程式碼詳盡分析與解讀
- UART學習
- UART協議協議
- 串列埠UART串列埠
- 詳解javascript拖拽(二)拖拽的應用及示例JavaScript
- CES 2013: 福特釋出軟體開發工具包(SDK)
- Google官方MVP示例程式碼閱讀筆記GoMVP筆記
- Android HAL 層框架分析以及程式碼示例Android框架
- SVCHOST程式解讀
- Java讀取properties配置檔案工具包Java
- CCS 2022 | 以太坊改進提案1559實證分析
- ASP.NET 微軟Web應用示例程式走廊-專案解決方案ASP.NET微軟Web
- MySQL資料分析儲存引擎示例講解HKEAMySql儲存引擎
- 基於Linux的tty架構及UART驅動詳解Linux架構
- werkzeug原始碼分析——從官網的示例程式碼開始原始碼
- 追捕檔案WRY.DLL的淺顯分析及程式示例 (轉)
- Sentry-JS-SDK-Browser 官方示例最佳實踐JS
- 解讀Linux程式Linux
- kafka程式碼解讀Kafka
- 【Azure Developer】使用 Python SDK連線Azure Storage Account, 計算Blob大小程式碼示例DeveloperPython
- LSTM Keras下的程式碼解讀Keras
- 解讀釋出:.NET Core RC2 and .NET Core SDK Preview 1View
- ccs的介紹,安裝和使用入門
- 美顏SDK詳解,您瞭解美顏SDK嗎?
- Android SDK簡明教程:應用程式資料Android
- Android SDK簡明教程:應用程式資源Android