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

📄 uart.c

📁 基于arm—LPC2103的串口通讯程序
💻 C
字号:
#include "lpc21xx.h"
#define 	Fpclk		11059200/4
#define		UART_BPS    4800                                         	/*  串口通信波特率              */
#define		LN 			128
int RcvNew;
enum OptCodeType {PUSH,POP,CLR,CHECK};
/*********************************************************************************************************
** Function name:		int SentFIFO(int OptCode,char OptNum)
** Descriptions:		FIFO函数,用作发送缓存
** input parameters:    OptCode (PUSH	POP		CLR		CHECK	OTHER)
						OptNum	(DATA  	NUll	NULL 	NULL	NULL)
** Returned value:      int		(0/1 	0/DATA	1		Long	0	)
** output parameters:	无
*********************************************************************************************************/
int SentFIFO(int OptCode,char OptNum)
{	  
	#define FIFO_Size 128
	static char FIFO[FIFO_Size],ptIN,ptOUT;
	switch(OptCode)
	{
		case PUSH :
		if(ptOUT==((ptIN+1)%FIFO_Size)) return 0 ;
		else 
		{
			FIFO[ptIN]=OptNum;	
			ptIN=(ptIN+1)%FIFO_Size;
			return	1;
		} 

		
		case POP :
		if(ptIN==ptOUT) return(0);
		else
		{ 	
			OptNum=FIFO[ptOUT];
			ptOUT=(ptOUT+1)%FIFO_Size;
			return(OptNum);
		}
		
		case CLR :
		ptOUT=ptIN;
		return 1;

		
		case CHECK:
		if(ptOUT>ptIN) return(ptOUT-ptIN);
		else return (ptIN-ptOUT);

		default:
		return 0;
	}
	
}

/*********************************************************************************************************
** Function name:		int RevFIFO(int OptCode,char OptNum)
** Descriptions:		FIFO函数,用作接收缓存
** input parameters:    OptCode (PUSH	POP		CLR		CHECK	OTHER)
						OptNum	(DATA  	NUll	NULL 	NULL	NULL)
** Returned value:      int		(0/1 	0/DATA	1		Long	0	)
** output parameters:	无
*********************************************************************************************************/

int RcvFIFO(int OptCode,char OptNum)
{	  
	#define FIFO_Size 128
	static char FIFO[FIFO_Size],ptIN,ptOUT;
	switch(OptCode)
	{
		case PUSH :
		if(ptOUT==((ptIN+1)%FIFO_Size)) return 0 ;
		else 
		{
			FIFO[ptIN]=OptNum;	
			ptIN=(ptIN+1)%FIFO_Size;
			return	1;
		} 

		
		case POP :
		if(ptIN==ptOUT) return(0);
		else
		{ 	
			OptNum=FIFO[ptOUT];
			ptOUT=(ptOUT+1)%FIFO_Size;
			return(OptNum);
		}
		
		case CLR :
		ptOUT=ptIN;
		return 1;

		
		case CHECK:
		if(ptOUT>ptIN) return(ptOUT-ptIN);
		else return (ptIN-ptOUT);

		default:
		return 0;
	}
	
}

/*********************************************************************************************************
** Function name:		AutoSent(void)
** Descriptions:		串口发送缓冲区送到THER
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void AutoSent(void)
{
	int i;
	for(i=0;i<8;i++)
		if(!SentFIFO(CHECK,0))	{ return;}
		else	U0THR=SentFIFO(POP,0);				
}
/*********************************************************************************************************
** Function name:		UART0_IRQ
** Descriptions:		串口中断服务函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  UART0_IRQ (void) __irq
{
    int i,flag=U0IIR ;  
  	switch (flag & 0x0e)													/*  判断中断标志                */
		{ 		                                     						/*  接收数据中断                */    
    		case 0x04:                                			
			    for (i= 0;i < 8;i++)                						/*  连续接收8个字节             */
                	RcvFIFO(PUSH,U0RBR);		
            	break;
            case 0x0C: 			                                            /*  字符超时中断                */
                while ((U0LSR & 0x01) == 0x01)								/*  判断数据是否接收完毕        */ 
			       RcvFIFO(PUSH,U0RBR);              	
            	break;
			case 0x02:				   
				AutoSent(); 
				break;            
            default:
                break;       
    }
   
   VICVectAddr = 0x00;
   
}



/*********************************************************************************************************
** Function name:		UARTInit
** Descriptions:		串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为9600
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UARTInit (void)
{
    const int uiFdiv=((Fpclk / 16) / UART_BPS); 						/*  设置波特率*/
    PINSEL0 = PINSEL0 & (~0x0F);                                        
    PINSEL0 = PINSEL0 | 0x05;                                           /*  设置I/O连接到UART           */
	U0LCR  = 0x83;                                                      /*  允许设置波特率              */                               
    U0DLM  = uiFdiv / 256;
    U0DLL  = uiFdiv % 256; 
    U0LCR  = 0x03;                                                      /*  锁定波特率                  */
	U0FCR = 0x81;                                                       /*  使能FIFO,设置8个字节触发点 */
    U0IER = 0x07;                                                       /*  使能接收中断                */
	VICIntSelect = 0x00000000;                                          /*  设置所有中断为向量中断      */
    VICVectCntl0 = 0x20 | 0x06;                                         /*  设置串口中断为最高优先级    */
    VICVectAddr0 = (int)UART0_IRQ;                           		    /*  设置向量地址                */
    VICIntEnable = 1 << 0x06;                                           /*  使能串口中断  				*/
}


/*********************************************************************************************************
** Function name:		UART0SendStr
** Descriptions:		向串口发送一个字符
** input parameters:    varChar   要发送的字符串指针
** output parameters:   无
** Returned value:      无
***************************************************************************************8****************/

void UART0SendByte (char varChar)
{
    SentFIFO(PUSH,varChar);                                          /*  写入数据                    */
    if(U0LSR&0x40)                                       			 /*  数据空,重写数据            */
		AutoSent();
}

/*********************************************************************************************************
** Function name:		UART0SendStr
** Descriptions:		向串口发送字符串
** input parameters:    Str   要发送的字符串指针
** output parameters:   无
** Returned value:      无
***************************************************************************************8****************/
void UART0SendStr(char const *Str)
{	int flag;
	while( *Str) 
	{                 											   	 /*  发送字符串,以字符串结束符结束*/
    flag=SentFIFO(PUSH,*Str++); 
	if(!flag) break;
	}
	if(U0LSR&0x20)                                       		    			         
		AutoSent();
}

/*********************************************************************************************************
** Function name:		main
** Descriptions:		串口0中断方式通信
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
    char i;
    UARTInit ();                                                        /*  串口初始化                  */
    VICIntSelect = 0x00000000;                                          /*  设置所有中断为向量中断      */
    VICVectCntl0 = 0x20 | 0x06;                                         /*  设置串口中断为最高优先级    */
    VICVectAddr0 = (int)UART0_IRQ;                           		    /*  设置向量地址                */
    VICIntEnable = 1 << 0x06;                                           /*  使能串口中断                */	
	UART0SendStr ("===================Hello! ZhiHui Chengjiang=======================\n");
	UART0SendStr ("ARM: I'm ready now,sent me the massage!\n");
    while (1)
	{
            if(RcvFIFO(CHECK,0))
			{                                 						
           		i=RcvFIFO(POP,0);
				if(i)														
					UART0SendByte(i);												/*  向串口发送数据 */             */
            }               			
    }
 	return 0;
}

/*********************************************************************************************************
                           End Of File
**********************************************************************************************************/

⌨️ 快捷键说明

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