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

📄 drv_uart.c

📁 S3C4510B的一些开发例程
💻 C
字号:
/***********************************************************************
 *  MODULE:        drv_uart.c     
 *  Description:   Uart Driver
 *  Runtime Env:   ARM7TDMI - KS32C50100
 *  Company:       
 *  Change History:
 *     03-28-02   Create (Yadong Wang)
 ***********************************************************************/
#include "common_types.h"
#include "samsung4510.h"
#include "main.h"

static void Uart1Isr(void);

tU16 DrvUartInit()
{
	// 8 Bit Data, 1 stop bit, No parity, external clock
	UARTLCON0 = 0x43;
	
	// RxMode = IRQ, RxStatus IRQ enable, TxMode = IRQ
	UARTCONT0 = 0x0D; //(UCON_RXM_INTREQ|UCON_TXM_INTREQ|UCON_RXSTAT_INT);

	// Baud: Using external clock 29.4912MHz - 29491200/115200/16 = 16
	UARTBRD0  = 0x0010; //0x00D0; //0x0001; 


	// 8 Bit Data, 1 stop bit, No parity, external clock
	UARTLCON1 = 0x43;
	
	// RxMode = IRQ, RxStatus IRQ enable, TxMode = IRQ
	UARTCONT1 = 0x0D; //(UCON_RXM_INTREQ|UCON_TXM_INTREQ|UCON_RXSTAT_INT);

	// Baud: Using external clock 29.4912MHz - 29491200/115200/16 = 16
	UARTBRD1  = 0x0010; //0x00D0; //0x0001; 

	SysSetInterrupt(nUART1_RX_ERR_INT, Uart1Isr);

	// Enable the INT, Enable_Int(nTIMER1_INT);  
	Enable_Int(nUART1_RX_ERR_INT); 

	return 0;
}


tU16 DrvUartWrite(tU8 *DataBuf, tU16 size)
{
	int i;

	for(i=0; i<size; i++)
	{
		while(!(UARTSTAT0 & 0x0040));
			UARTTXH0 = DataBuf[i];
	}

	// wait the transmit complete
	while(!(UARTSTAT0 & 0x0080));

	return 0;
}


tU32 DrvUartRead(tU32 Dev, tU8 *data, tU32 ReqSize)
{
	tU32 size;
	tU8 *ptr;

	ptr = data;
	size = 0;

	// reset timer, 4ms time out
	DrvTimerArm(0, 4000);

	while(1)
	{
		if (UARTSTAT0 & 0x0020)
		{
			*ptr++ = UARTRXB0; 
			size++;
		
			// reset timer, 4ms time out
			DrvTimerArm(0, 4000);
		}
		else
		{
			if (DrvTimerTimeout(0))
				break;
		}
	}

	return size;
}


tU16 DrvUartCntrl(tU16 cmd, void *data)
{
	switch (cmd)
	{
		case 0: //UART_TX_DONE:
		break;

		case 1: //UART_SET_BAUD:
		break;
      
		default:
		break;
	}
	return 0;
}


void Print(char *buf)
{
   tU16 i;
   tU8 UartBuf[100];
   tS8 *ptr;

   // Data convert and buffer copy
   ptr = buf;
   for(i=0; *ptr; ptr++)
   {
      UartBuf[i++] = *ptr;
      if (*ptr == '\n') 
         UartBuf[i++] = '\r';
   }

   // Send the data
   DrvUartWrite(UartBuf, i); 
}

static void Uart1Isr()
{
	tU8 ch;

	INTPEND |= UART1_RX_ERR_INT;

	if (UARTSTAT1 & 0x0020)
	{
		ch = UARTRXB1; 
		while(!(UARTSTAT1 & 0x0040));
		UARTTXH1 = ch;
		while(!(UARTSTAT1 & 0x0080));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -