📄 uart.c
字号:
/*
*******************************************************************************
* HEADER FILES
*******************************************************************************
*/
#include "44b0.h"
#include "dm.h"
UartContextT Uart0, Uart1;
UartContextT *psUart = &Uart0;
/*
*******************************************************************************
* LOCAL DEFINITIONS
*******************************************************************************
*/
// initialize UART hardware
static UINT32 UartHWSetup (UartContextT *ctxP, UartCfgT *cfgP)
{
volatile UartRegsT *uartP = (UartRegsT *)ctxP->regsP;
UINT baudrate = 115200;
if (cfgP != NULL) baudrate = cfgP->rate;
uartP->UFCON = 0x37; //FIFO enabled
uartP->UMCON = 0x0; //auto flow control disabled, nRTS inactivate
uartP->ULCON = 0x3; //8-bits, 1 stop bit, no parity, normal mode
uartP->UCON = 0x5; //no DMA, no break, no loop-back, no interrupts
uartP->UBRDIV = (int)(MCLK/(16*baudrate)+0.5)-1;
return 0;
}
// send function
static void writeUart (UartContextT *ctxP, CHAR *txbufP, INT len)
{
volatile UartRegsT *uartP = (UartRegsT *)ctxP->regsP;
INT i;
for (i=0; i<len; i++)
{
while ((uartP->UTRSTAT & 0x2) == 0); // wait until transmit buffer empty
uartP->UTXH = *txbufP++; // write data
}
return;
}
// block mode receive function
static INT readUart (UartContextT *ctxP, CHAR *ch)
{
volatile UartRegsT *uartP = (UartRegsT *)ctxP->regsP;
while ((uartP->UTRSTAT & 0x1) == 0); // wait until receive buffer data ready
*ch = uartP->URXH; // read data
return 1;
}
// non-block mode receive function
static INT checkUart (UartContextT *ctxP, CHAR *ch)
{
volatile UartRegsT *uartP = (UartRegsT *)ctxP->regsP;
if ((uartP->UTRSTAT & 0x1) != 0) // receive buffer data ready
{
*ch = uartP->URXH; // read data
return 1;
}
else // receive buffer empty
{
return 0;
}
}
// read RX FIFO until empty
static INT clearRxUart (UartContextT *ctxP)
{
volatile UartRegsT *uartP = (UartRegsT *)ctxP->regsP;
UINT data;
INT total = 0;
// read data from FIFO until none is left
while ((uartP->UTRSTAT & 0x1) != 0)
{
data = uartP->URXH;
total ++;
}
if (data == 0);
return total;
}
// initialize UART's context structure
// no hardware setup is done at this point
void UartSWInit (void)
{
UartContextT *ctxP;
UartRegsT *regsP;
// initialize UART0 context pointer
ctxP = &Uart0;
// initialize UART0's register base
regsP = (UartRegsT *)UART0REG_BASE;
ctxP->regsP = regsP;
// set UART0 context structures functions pointers
ctxP->setupUartFnP = (UartSetupT)UartHWSetup;
ctxP->writeUartFnP = (UartWriteT)writeUart;
ctxP->readUartFnP = (UartReadT)readUart;
ctxP->checkUartFnP = (UartCheckT)checkUart;
ctxP->clearRxUartFnP= (UartClearRxT)clearRxUart;
// initialize UART1 context pointer
ctxP = &Uart1;
// initialize UART1's register base
regsP = (UartRegsT *)UART1REG_BASE;
ctxP->regsP = regsP;
// set UART1 context structures functions pointers
ctxP->setupUartFnP = (UartSetupT)UartHWSetup;
ctxP->writeUartFnP = (UartWriteT)writeUart;
ctxP->readUartFnP = (UartReadT)readUart;
ctxP->checkUartFnP = (UartCheckT)checkUart;
ctxP->clearRxUartFnP= (UartClearRxT)clearRxUart;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -