⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 iar公司的s3c44b0x评估板的源程序
💻 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 + -