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

📄 w90p710_uart_int.c

📁 基于中断的串口驱动~~~~~~~~~~~~~~~~~~
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -