?? uartlib.c
字號:
#include <stdarg.h>
#include <stdio.h>
#include "def.h"
#include "touch.h"
#include "UartLib.h"
#include "2410lib.h"
#include "2410addr.h"
#include "Int.h"
UART_PORT UartPort0; // 串口0對應(yīng)的結(jié)構(gòu)體
int UartRxEndFlag;
/*
| 函數(shù): Receive_Uart0, 串口0接收中斷程序
| 參數(shù): 無
| 返回: 無
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
void __irq Receive_Uart0(void)
{
// int temp;
U8 receive;
INT_ADC_Enable(FALSE);
if (UartPort0.RxBufferStatus != BUFFER_FULL)
do
{
receive = RxUart(UART0);
UartPort0.RxBuffer[UartPort0.RxBufferWrite++] = receive;
// 檢查緩沖區(qū)
if (UartPort0.RxBufferWrite == UartPort0.bufferSize)
UartPort0.RxBufferWrite = 0;
if (UartPort0.RxBufferWrite == UartPort0.RxBufferRead)
UartPort0.RxBufferStatus = BUFFER_FULL;
else
UartPort0.RxBufferStatus = BUFFER_DATA;
} while (rUTRSTAT0 & 0x1);
ClearInt(); // 清中斷
INT_ADC_Enable(TRUE);
}
/*
| 函數(shù): UartGetChar, 從串口緩沖區(qū)提取一個字符
| 參數(shù): UART_PORT *port, 串口對應(yīng)結(jié)構(gòu)體
| 返回: U8, 返回取得的字符,類型為U8(unsigned char)
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
U8 UartGetChar(UART_PORT *port)
{
U8 ch = 0;
if (port->RxBufferStatus != BUFFER_EMPTY)
{
ch = port->RxBuffer[port->RxBufferRead++];
if (port->RxBufferRead == port->bufferSize)
port->RxBufferRead = 0;
if (port->RxBufferRead == port->RxBufferWrite)
port->RxBufferStatus = BUFFER_EMPTY;
else
port->RxBufferStatus = BUFFER_DATA;
}
Delay(2);
return ch;
}
/*
| 函數(shù): SetDefaultToUart, 把串口結(jié)構(gòu)體設(shè)為默認(rèn)值
| 參數(shù)1: UART_PORT *port, 串口對應(yīng)結(jié)構(gòu)體
| 參數(shù)2: int com, 目標(biāo)串口
| 返回: 無
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
void SetDefaultToUart(UART_PORT *port, int com)
{
port->comPort = com; // 目標(biāo)串口
port->baudRate = 112500; // 波特率
port->dataBits = 3; // 8 bits per frame
port->stopBits = 0; // One stop bit per frame
port->parity = 0; // No parity
port->dataMode = 0; // UART runs in normal operation
port->communicationMode = 0;// ???
port->bufferSize = 1024; // 接收緩沖大小
}
/*
| 函數(shù): InitUartPort, 初始化串口
| 參數(shù): UART_PORT *port, 串口對應(yīng)結(jié)構(gòu)體
| 返回: int, 保留(未使用)
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
int InitUartPort(UART_PORT *port)
{
// int temp;
if (port->comPort == UART0)
{
port->vector = 28;
port->baseAddr = UART0_BASE;
}
else
if (port->comPort == UART1)
{
port->vector = 23;
port->baseAddr = UART1_BASE;
}
else
if (port->comPort == UART2)
{
port->vector = 15;
port->baseAddr = UART2_BASE;
}
else
return 0;
// Setup the RX SD buffer
port->RxBufferRead = port->RxBufferWrite = 0;
port->RxBufferStatus = BUFFER_EMPTY;
// Clear Control registers
SET_REGISTER(port->baseAddr + rULCON_OFFSET, 0);
SET_REGISTER(port->baseAddr + rUCON_OFFSET, 0);
SET_REGISTER(port->baseAddr + rUFCON_OFFSET, 0);
SET_REGISTER(port->baseAddr + rUMCON_OFFSET, 0);
// Setup baud rate
SetBaudrate(port->baudRate, port->comPort);
// Setup Mode, Parity, Stop Bits and Data Size in ULCON Reg.
SET_REGISTER(port->baseAddr + rULCON_OFFSET
,port->parity | port->dataBits | port->stopBits);
rUCON0 = 0x245;
//do{
// temp = GET_REGISTER(port->baseAddr + rURXH_OFFSET);
//} while (GET_REGISTER(port->baseAddr + rUTRSTAT_OFFSET) & 1);
UartInterrupt(TRUE, port->comPort);
return 0;
}
/*
| 函數(shù): SetBaudrate, 設(shè)置串口波特率
| 參數(shù)1: U32 baudRate, 波特率
| 參數(shù)2: int com, 目標(biāo)串口
| 返回: 無
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
void SetBaudrate(U32 baudRate, int com)
{
int pclk = 202800000/4;
switch(com)
{
case UART0:
{
rUBRDIV0 = (int)(pclk/16./baudRate + 0.5) - 1;
}break;
case UART1:
{
rUBRDIV1 = (int)(pclk/16./baudRate + 0.5) - 1;
}break;
case UART2:
{
rUBRDIV2 = (int)(pclk/16./baudRate + 0.5) - 1;
}break;
default:
{
}break;
}
}
/*
| 函數(shù): UartPutChar, 向串發(fā)送一個字符
| 參數(shù)1: U8 ch, 將要發(fā)送的字符
| 參數(shù)2: UART_PORT *port, 目標(biāo)串口
| 返回: 無
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
void UartPutChar(U8 ch, UART_PORT *port)
{
int status;
status = GET_REGISTER(port->baseAddr + rUTRSTAT_OFFSET);
while(!(status & 0x2));
Delay(2);
switch(port->comPort)
{
case UART0:
{
WrUTXH0(ch);
}break;
case UART1:
{
WrUTXH1(ch);
}break;
case UART2:
{
WrUTXH2(ch);
}break;
}
}
void UartSimplePutChar(U8 ch, int com)
{
switch(com)
{
case UART0:
{
while(rUFSTAT0 & 0x2); //Wait until THR is empty.
Delay(2);
WrUTXH0(ch);
}break;
case UART1:
{
while(rUFSTAT1 & 0x2); //Wait until THR is empty.
Delay(2);
WrUTXH1(ch);
}break;
case UART2:
{
while(rUFSTAT2 & 0x2); //Wait until THR is empty.
Delay(2);
WrUTXH2(ch);
}break;
}
}
/*
| 函數(shù): UartPutStr, 向串發(fā)送一個字符串
| 參數(shù)1: char *str, 將要發(fā)送的字符
| 參數(shù)2: UART_PORT *port, 目標(biāo)串口
| 返回: 無
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
void UartPutStr(char *str, UART_PORT *port)
{
while(*str)
UartPutChar(*str++, port);
}
void UartSimplePutStr(char *str, int com)
{
while(*str)
UartSimplePutChar(*str++, com);
}
void UartPrintf(int com, char *strFmt,...)
{
va_list ap;
char String[256];
va_start(ap, strFmt);
vsprintf(String, strFmt, ap);
UartSimplePutStr(String,com);
va_end(ap);
}
/*
| 函數(shù): RxUart, 從串口接收一個字符
| 參數(shù): int com, 目標(biāo)串口
| 返回: U8 收到的字符
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
U8 RxUart(int com)
{
switch(com)
{
case UART0:
return (char)RdURXH0();
break;
case UART1:
return (char)RdURXH1();
break;
case UART2:
return (char)RdURXH2();
break;
}
return 0;
}
/*
| 函數(shù): RxUartS, 從串口接收一個字符(帶返回狀態(tài))
| 參數(shù): char *data, 收到的字符
| 參數(shù): int Uart, 目標(biāo)串口
| 返回: int 返回狀態(tài);TRUE,成功;FALSE失敗
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
int RxUartS(char *data,int Uart)
{
switch(Uart)
{
case UART0:
if(rUFSTAT0 & 0x1)
{
*data = rURXH0;
return TRUE;
}break;
case UART1:
if(rUFSTAT1 & 0x1)
{
*data = rURXH1;
return TRUE;
}break;
case UART2:
if(rUFSTAT2 & 0x1)
{
*data = rURXH2;
return TRUE;
}break;
}
return FALSE;
}
void UartWaitForStr(char *str, int Uart)
{
char *tempStr = str;
char ch = 0;
int flag = 1;
UartRxEndFlag = FALSE;
while(ch !='\r' && UartRxEndFlag == FALSE)
{
flag = RxUartS(&ch,Uart);
if (flag == TRUE)
{
if (ch == '\b')
{
if ((int)tempStr < (int)str)
{
UartPrintf(Uart ,"\b \b");
str--;
}
}
else
{
*str = ch;
str++;
UartSimplePutChar(ch,Uart);
}
}
}
UartRxEndFlag = TRUE;
str--;
*str = '\0';
UartPrintf(Uart ,"\n\n");
}
/*
| 函數(shù): UartInterrupt, 串口中斷使能
| 參數(shù)1: int enable, 使能
| 參數(shù)2: int com, 目標(biāo)串口
| 返回: 無
|
| 日期: 06/12/18
| 創(chuàng)建人: ZengJC
*/
void UartInterrupt(int enable, int com)
{
switch(com)
{
case UART0:
{
if (enable == TRUE)
{
rINTMSK &= ~BIT_UART0;
//rINTMOD &= ~BIT_UART0;
rINTSUBMSK &= ~(BIT_SUB_RXD0 | BIT_SUB_RXD0);
}else{
rINTMSK |= BIT_UART0;
rINTSUBMSK |= BIT_SUB_RXD0;
}
}break;
case UART1:
{
if (enable == TRUE)
{
rINTMSK &= ~BIT_UART1;
rINTSUBMSK &= ~BIT_SUB_RXD1;
}else{
rINTMSK |= BIT_UART1;
rINTSUBMSK |= BIT_SUB_RXD1;
}
}break;
case UART2:
{
if (enable == TRUE)
{
rINTMSK &= ~BIT_UART2;
rINTSUBMSK &= ~BIT_SUB_RXD2;
}else{
rINTMSK |= BIT_UART2;
rINTSUBMSK |= BIT_SUB_RXD2;
}
}break;
default:
{
}break;
}
}
void UartDefaultInit(int Uart)
{
switch(Uart)
{
case UART0:
{
rUFCON0 = 0;
rUMCON0 = 0;
rULCON0 = 0x23;
rUCON0 = 0x245;
}break;
case UART1:
{
rUFCON1 = 0;
rUMCON1 = 0;
rULCON1 = 0x23;
rUCON1 = 0x245;
}break;
case UART2:
{
rUFCON2 = 0;
rUMCON2 = 0;
rULCON2 = 0x23;
rUCON2 = 0x245;
}break;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -