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

📄 uart2410.c

📁 HaiBIOS 是为我的S3C2410开发板写的一个启动程序。 C盘是RAMDISK
💻 C
字号:
/*
;---------------------------------------------------------------------------------
; Copyright (c) Haisoft 2007-9-1
; Author:				Kingsea
; Email:				jinhailiao@163.com
;-------------------------------------------------------------
; Project:				HaiBios
; File:					uart2410.c
; Description:	arm boot to the second stage
;-------------------------------------------------------------
; Reversion Histroy:
;-------------------------------------------------------------
; Version		date		operations				by who
; 1.0.0		2007-09-01		Create					Kingsea
;
;---------------------------------------------------------------------------------
*/
#include "haitype.h"
#include "cfg2410.h"
#include "reg2410.h"
#include "uart2410.h"

void hai_UartDelay(S_DWORD ms)
{
	S_DWORD i = 0;
	
	while (i++ < ms);
}

static S_BYTE whichUart = UART_NO0;

void hai_InitUART(void)
{
	int i;
	S_DWORD pclk = PCLK;
	S_DWORD baud = 115200;//init val

	whichUart = UART_NO0;	

	rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
	rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable
	rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable
	rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
	rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable
	
	//UART0
	rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
	//    [10]       [9]     [8]        [7]        [6]      [5]         [4]           [3:2]        [1:0]
	// Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode
	//     0          1       0    ,     0          1        0           0     ,       01          01
	//   PCLK       Level    Pulse    Disable    Generate  Normal      Normal        Interrupt or Polling
	rUCON0  = 0x245;                        // Control register
	//    rUBRDIV0=( (int)(pclk/16./baud) -1 );   //Baud rate divisior register 0
	rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //Baud rate divisior register 0    
	
	//UART1
	rULCON1 = 0x3;
	rUCON1  = 0x245;
	rUBRDIV1=( (int)(pclk/16./baud) -1 );
	
	//UART2
	rULCON2 = 0x3;
	rUCON2  = 0x245;
	rUBRDIV2=( (int)(pclk/16./baud) -1 );    
	
	for(i=0;i<100;i++)
		;
}

S_BYTE hai_SelectUART(S_BYTE UartNo)
{
	S_BYTE OldNo = whichUart;
	
	whichUart = UartNo;
	
	return OldNo;
}

S_BYTE hai_SetUART(S_BYTE UartNo, S_BYTE Parity, S_BYTE StopBit, S_BYTE DataLen, S_DWORD baud)
{
	S_BYTE OldNo = whichUart;
	S_BYTE LineCon = (Parity<<3)|(StopBit<<1)|DataLen;
	S_DWORD brdiv = PCLK/(16*baud)-1;

	whichUart = UartNo;
	if (whichUart == UART_NO0)
	{
		rULCON0 = LineCon;
		rUBRDIV0 = brdiv;    
	}
	else if (whichUart == UART_NO1)
	{
		rULCON1 = LineCon;
		rUBRDIV1 = brdiv;    
	}
	else if (whichUart == UART_NO2)
	{
		rULCON2 = LineCon;
		rUBRDIV2 = brdiv;    
	}
	
	return OldNo;
}

S_BYTE hai_UartGetChar(void)
{
	if(whichUart==UART_NO0)
	{       
		while(!(rUTRSTAT0 & 0x1)); //Receive data ready
		return RdURXH0();
	}
	else if(whichUart==UART_NO1)
	{       
		while(!(rUTRSTAT1 & 0x1)); //Receive data ready
		return RdURXH1();
	}
	else if(whichUart==UART_NO2)
	{
		while(!(rUTRSTAT2 & 0x1)); //Receive data ready
		return RdURXH2();
	}
	return 0;
}

void hai_UartPutChar(S_BYTE data)
{
	if(whichUart==UART_NO0)
	{
		while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
		hai_UartDelay(10);
		WrUTXH0(data);
	}
	else if(whichUart==UART_NO1)
	{
		while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
		hai_UartDelay(10);
		rUTXH1 = data;
	}   
	else if(whichUart==UART_NO2)
	{
		while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
		hai_UartDelay(10);
		rUTXH2 = data;
	}       
}        

int hai_scanf(const char *format, char *Buf)
{
	S_BYTE ch;
	char *p = Buf;

	while (1)
	{
		ch = hai_UartGetChar();
		hai_UartPutChar(ch);
		
		if ((ch==' ' || ch=='\t') && p-Buf)
			break;
		else if (ch==0x0D || ch== 0x0A)
			break;
		
		if (ch != ' ' && ch != '\t')
			*p++ = ch;
	}
	*p = '\0';

	return (int)(p-Buf);
}

⌨️ 快捷键说明

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