?? w90p710_uart_int.c
字號:
char c;
char *str;
int lFlag; //長整型標志
int base; //基數變量,用于表明是多少進制
int sign; //符號標志
va_start(ap, fmt); //使ap指針指向第一個未命名的參數
for (; *fmt != '\0'; fmt++)
{
lFlag = false;
base = 0;
sign = false;
if (*fmt == '%')
{
if ((c = *++fmt) == 'l')
{
lFlag = true;
c = *++fmt;
}
switch (c)
{
case 'o':
case 'O': // 八進制數據
base = 8;
sign = false;
break;
case 'd':
case 'D': // 十進制數據
base = 10;
sign = true;
break;
case 'u':
case 'U': // 無符號數據
base = 10;
sign = false;
break;
case 'x':
case 'X': // 十六進制數據
base = 16;
sign = false;
break;
case 's': // 字符串
for (str = va_arg(ap, char *); *str; str++)
{
Uart_Int_PutChar(uartPortNo,*str);
}
break;
case 'c': // 字符
Uart_Int_PutChar(uartPortNo,(unsigned char)(va_arg(ap, int)));
break;
default:
Uart_Int_PutChar(uartPortNo,c);
break;
}
if (base)
{
Uart_Int_PrintNum(uartPortNo,lFlag ? va_arg(ap, long long) : (long long)va_arg(ap, int), base, sign);
}
}
else
{
Uart_Int_PutChar(uartPortNo,*fmt);
}
}
va_end(ap);
Uart_Int_PutString(uartPortNo,"\r\n");
}
void Uart_Int_SetBandRate(T_UART_PORT uartPortNo,T_UART_BANDRATE bandRate)
{
unsigned int value = 0;
unsigned int divisor = 0;
switch(uartPortNo)
{
case UART_PORT0:
//設置波特率
//保存原來的狀態,以便以后恢復用.(即對DLAB位的操作)
REG_READ_UINT32(REG_UART0_LCR,value);
//清除LCR設置
REG_WRITE_UINT32(REG_UART0_LCR,0xFFFFFF00);
//DLAB Divider Latch Access Bit,UART_LCR中的BIT7
//DLAB = 0,用來訪問RBR,THR,IER
//DLAB = 1,用來訪問Divider Latch寄存器(DLL,DLM)
//設置DLAB為1,以便訪問DLM,DLL
REG_UINT32_VALUE(REG_UART0_LCR)|= BIT7;
switch(bandRate)
{
case B115200:
case B57600:
case B38400:
case B19200:
case B9600:
divisor = ((unsigned int)(UART_DEFAULT_CLK/(16*bandRate))-2);
break;
default:
divisor = ((unsigned int)(UART_DEFAULT_CLK/(16*UART_DEFAULT_BANDRATE))-2);
break;
}
//設置低位的除數寄存器
REG_WRITE_UINT32(REG_UART0_DLL,divisor & 0xFF);
//設置高位的除數寄存器
REG_WRITE_UINT32(REG_UART0_DLM,(divisor & 0xff00) >> 8);
//將DLAB位再置零,以使DLL和DLM恢復為RBR/THR,IER
REG_WRITE_UINT32(REG_UART0_LCR,value);
break;
case UART_PORT1:
REG_READ_UINT32(REG_UART1_LCR,value);
REG_WRITE_UINT32(REG_UART1_LCR,0xFFFFFF00);
REG_UINT32_VALUE(REG_UART1_LCR)|= BIT7;
switch(bandRate)
{
case B115200:
case B57600:
case B38400:
case B19200:
case B9600:
divisor = ((unsigned int)(UART_DEFAULT_CLK/(16*bandRate))-2);
break;
default:
divisor = ((unsigned int)(UART_DEFAULT_CLK/(16*UART_DEFAULT_BANDRATE))-2);
break;
}
REG_WRITE_UINT32(REG_UART1_DLL,divisor & 0xFF);
REG_WRITE_UINT32(REG_UART1_DLM,(divisor & 0xff00) >> 8);
REG_WRITE_UINT32(REG_UART1_LCR,value);
break;
default:
break;
}
}
void Uart_Int_SetDataBits(T_UART_PORT uartPortNo,T_UART_DATABITS dataBits)
{
switch(uartPortNo)
{
case UART_PORT0:
switch(dataBits)
{
case B5:
// WLS : 00 -> 5 bits
REG_UINT32_VALUE(REG_UART0_LCR) &= ~( BIT0 | BIT1 );
break;
case B6:
// WLS : 01 -> 6 bits
REG_UINT32_VALUE(REG_UART0_LCR) &= ~BIT1;
REG_UINT32_VALUE(REG_UART0_LCR) |= BIT0;
break;
case B7:
// WLS : 10 -> 7 bits
REG_UINT32_VALUE(REG_UART0_LCR) &= ~BIT0;
REG_UINT32_VALUE(REG_UART0_LCR) |= BIT1;
break;
case B8:
// WLS : 11 -> 8 bits
REG_UINT32_VALUE(REG_UART0_LCR) |= ( BIT0 | BIT1 );
break;
default:
break;
}
break;
case UART_PORT1:
switch(dataBits)
{
case B5:
// WLS : 00 -> 5 bits
REG_UINT32_VALUE(REG_UART1_LCR) &= ~( BIT0 | BIT1 );
break;
case B6:
// WLS : 01 -> 6 bits
REG_UINT32_VALUE(REG_UART1_LCR) &= ~BIT1;
REG_UINT32_VALUE(REG_UART1_LCR) |= BIT0;
break;
case B7:
// WLS : 10 -> 7 bits
REG_UINT32_VALUE(REG_UART1_LCR) &= ~BIT0;
REG_UINT32_VALUE(REG_UART1_LCR) |= BIT1;
break;
case B8:
// WLS : 11 -> 8 bits
REG_UINT32_VALUE(REG_UART1_LCR) |= ( BIT0 | BIT1 );
break;
default:
break;
}
break;
default:
break;
}
}
void Uart_Int_SetParity(T_UART_PORT uartPortNo,T_UART_PARITY parity)
{
switch(uartPortNo)
{
case UART_PORT0:
switch(parity)
{
case NONE:
//無奇偶校驗
REG_UINT32_VALUE(REG_UART0_LCR) &= ~BIT3;
break;
case ODD:
//有奇偶校驗
REG_UINT32_VALUE(REG_UART0_LCR)|= BIT3;
REG_UINT32_VALUE(REG_UART0_LCR)&= ~BIT4;
break;
case EVEN:
REG_UINT32_VALUE(REG_UART0_LCR)|= (BIT3|BIT4);
break;
case MARK:
break;
case SPACE:
break;
default:
break;
}
break;
case UART_PORT1:
switch(parity)
{
case NONE:
//無奇偶校驗
REG_UINT32_VALUE(REG_UART1_LCR) &= ~BIT3;
break;
case ODD:
//有奇偶校驗
REG_UINT32_VALUE(REG_UART1_LCR)|= BIT3;
REG_UINT32_VALUE(REG_UART1_LCR)&= ~BIT4;
break;
case EVEN:
REG_UINT32_VALUE(REG_UART1_LCR)|= (BIT3|BIT4);
break;
case MARK:
break;
case SPACE:
break;
default:
break;
}
break;
default:
break;
}
}
void Uart_Int_SetStopBits(T_UART_PORT uartPortNo,T_UART_STOPBITS stopBits)
{
switch(uartPortNo)
{
case UART_PORT0:
switch(stopBits)
{
case B1:
//停止位1位
REG_UINT32_VALUE(REG_UART0_LCR)&= ~BIT2;
break;
case B15:
case B2:
//當數據位為5位的長度時,1.5位停止位。
//當數據位長度為6、7、8位時,2位停止位
REG_UINT32_VALUE(REG_UART0_LCR)|= BIT2;
break;
default:
break;
}
break;
case UART_PORT1:
switch(stopBits)
{
case B1:
//停止位1位
REG_UINT32_VALUE(REG_UART1_LCR)&= ~BIT2;
break;
case B15:
case B2:
//當數據位為5位的長度時,1.5位停止位。
//當數據位長度為6、7、8位時,2位停止位
REG_UINT32_VALUE(REG_UART1_LCR)|= BIT2;
break;
default:
break;
}
break;
default:
break;
}
}
void Uart_Int_Delay(T_UART_PORT uartPortNo,int times)
{
int i=0;
Uart_Int_PutString(uartPortNo,"\r\nPlease waiting");
while(times -->0)
{
Uart_Int_PutString(uartPortNo,".");
while(i++ <0xFFFF);
i=0;
}
Uart_Int_PutString(uartPortNo,"\r\n");
}
void Uart_Int_Sync(T_UART_PORT uartPortNo)
{
//打開THRE中斷
switch(uartPortNo)
{
case UART_PORT0: REG_UINT32_VALUE(REG_UART0_IER)|=BIT1; break;
case UART_PORT1: REG_UINT32_VALUE(REG_UART1_IER)|=BIT1; break;
default: break;
}
}
static void myDelay(unsigned int times)
{
unsigned int i=0;
while(times-- > 0)
{
while(i++<0xFFFF);
i=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -