📄 uart2410.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 + -