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