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

📄 uart.c

📁 uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的real view模板 uc/os在lpc210X系列的real view模板
💻 C
字号:
#include "config.h"
void UartInit(int uartnum,int baud)
{
	uint16 Fdiv;
	if(uartnum==0)
	{
	    PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;    /* 选择管脚为UART0 */

	    U0LCR = 0x80;                               /* 允许访问分频因子寄存器 */
	    Fdiv = (Fpclk / 16) / baud;                  /* 设置波特率 */
	    U0DLM = Fdiv / 256;							
		U0DLL = Fdiv % 256;						
	    U0LCR = 0x03;                               /* 禁止访问分频因子寄存器 */
	                                                /* 且设置为8,1,n */
	    U0FCR = 0x07;		/* 使能并重启Rx、Tx缓冲寄存器 */                               /* 初始化FIFO */

		U0IER = IER_RBR | IER_THRE | IER_RLS;
		install_irq(VIC_UART0,(void *)Uart0_Exception);
	}
}
void Uart_SendByte(int uartnum,INT8U c)
{
	switch(uartnum)
	{
	case 0:
		U0THR=c;
		while((U0LSR & 0x40) == 0);                 // 等待数据发送完毕
		break;
	case 1:
		U1THR=c;
		while((U1LSR & 0x40) == 0);                 // 等待数据发送完毕
		break;
	default:
		break;	
	}
}
void Uart_SendString(int uartnum,char * s)
{
	while(*s!=0)
	{
		Uart_SendByte(uartnum,*s);
		s++;
	}
		
}
#define SENDBUFLEN  20
void Uart_Printf(char * fmt)
{
#if 0
	static INT8U  show_buf[SENDBUFLEN];
	memset(show_buf,0,sizeof(show_buf));
	va_list	vat;
	va_start(vat,fmt);
	vsprintf(show_buf,fmt,vat);
 	va_end(vat);
	Uart_SendString(0,show_buf);
#else
	Uart_SendString(0,fmt);
#endif 
}

 /*****************************************************************************
** 函数名	:	UART0Handler
**
**  功能描述:  UART0中断处理
** 
*****************************************************************************/
void Uart0_Exception(void)
{
    uint8 IIRValue, LSRValue;
    uint8 Dummy;
	OS_ENTER_CRITICAL();	       /*  */ 
    IIRValue = U0IIR;
    Dummy = U0RBR;		          /* 读RBR寄存器清楚中断 */	
	LSRValue = U0LSR; 
	VICVectAddr = 0; 
	OS_EXIT_CRITICAL();	
	     
	Dummy = Dummy;               /* 防止编译器警告 */       	   
    IIRValue >>= 1;			
    IIRValue &= 0x07;			/* 中断标识位1~3 */
    if ( IIRValue == IIR_RLS )		/* 接收线状态*/
    {
	
	if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
	{
		Uart_SendString(0,"Help~~~");
		return;
	}
	if ( LSRValue & LSR_RDR )	/* 接收数据准备好 */			
	{
	    /* 如果在接收线上没有错误, 正常准备好, 则保存数据.读RBR将清楚中断 */
	   Uart_SendString(0,"Thankyou for ~~~");	/*  write the code yourself*/
	   return ;
	}
    }
    else if ( IIRValue == IIR_RDA )	/* 接收数据可用 */
    {
	Uart_SendString(0,"UART0中断--");
	return ;
    }
    else if ( IIRValue == IIR_CTI )	/* 字符超时显示 */
    {
	/**/
    }
    else if ( IIRValue == IIR_THRE )	/* THRE, 传送寄存器空 */
    {
	if ( LSRValue & LSR_THRE )
	{
     /**/
	}
	else
	{
      /*  */
	}
    }
}


⌨️ 快捷键说明

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