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

📄 uartvic.c

📁 Arm 控制ad9954源程序
💻 C
字号:
 /*********************************************************************
 Author        : 
 Date          : jul. 2008
 File          : UARTVIC.c
 Hardware      : LPC2103
 Description   : UART data send with VIC	
*********************************************************************/

#include<LPC2103.H>
#define	BUZZ  (1<<5)
#define Fpclk (11059200*5)/4
#define UART_br 9600;
typedef struct UartMode
{ unsigned int datab;	  // data bits
  unsigned int stopb;	  // stop bits
  unsigned int parity;	  //parity bits
 }UARTMODE;

unsigned int rcv_buf[8];	//data buffer
volatile unsigned int rcv_new;	   //是否有数据的标志;
typedef unsigned int  unst32;
 /************************Read byte***************************/
 void UART0_ReadByte()
  { unst32 i;
    for(i=0;i<8;i++)		  
   {  while((U0LSR&0x01)==0);
      rcv_buf[i]=U0RBR;	   //读取FIFO里的数据;
    }
  }
 
 
 /**************send byte*****************/
void UART0_SendByte(unsigned int dat)
{  U0THR=dat;
   while((U0LSR&0x20)==0);
}

void UART0_SendBuf()
{  unsigned int i;
   for(i=0;i<8;i++)
   { UART0_SendByte(rcv_buf[i]);
   }
   	 	 //bit1=1 overrun error
}
/******************Baudrate Inital	**************************/
int UART0_Init(unsigned int baud,UARTMODE set)
{  unsigned int bak;
   
    //参数过滤;
   if((baud==0)||(baud>115900)) return(0);
   if((set.datab<5)||(set.datab>8))return(0) ;
   if((set.stopb==0)||(set.stopb>2)) return(0);
   if(set.parity>4) return(0);
   
  U0LCR=0x83;				// 波特率初始化;	  enable the Divisor latch(DLL and DLM).
  bak=(Fpclk/16)/baud;
  U0DLM=bak/256;
  U0DLL=bak%256;

   /*设置串口模式*/
   bak=set.datab-5;	 // 设置字长;	=11
   if(set.stopb==2) 	 // bit4=1;
      bak|=0x04;  //停止位判断;
   if(set.parity!=0)		//set.parity=0  disable parity interrup; 
   {  set.parity=set.parity-1;	   
     	}

  bak|=set.parity<<4;	 //设置奇偶位;
  U0LCR=bak;
  return(1);
}
/******************intrrupt program******************/
void __irq IRQ_UART0()
{ 
   if((U0IIR&0x0F)==0x04)	 //	 bit0=0 at east one interrupt is pending.
                           //bit[1..3] 010  RDA  receive data is available
	   rcv_new=1;
	 switch(U0IIR&0x0E)
	 {  case(0x06)	:
	         
	     break;
		 case(0x04)	 :
		 UART0_ReadByte();
		 break;
		 case(0x0C)	:
		 break;
		 case(0x02):
		 UART0_SendBuf();
		 break;
		  default:
		  break;
		 } 
  
   VICVectAddr=0x00000000;
 }

 /*****************send data UART************************/
#include<LPC2103.H>
#define	BUZZ  (1<<5)
#define Fosc  11059200
#define Fcclk  Fosc*4
#define Fpclk  (Fosc*5/4)
#define UART_br 9600
typedef unsigned int unst32	   ;
typedef unsigned short int unst16	;


/************** Delay funtion**********************/
void Delay(unsigned int ly)
{  unst32 i;
   for(;ly>0;ly--)
     for(i=0;i<50000;i++)
	 ;
	}
/*****************Inital Uart***********************/
void UART0_Init()			//UART0初始化;
{  unst16 Fdiv;
  U0LCR=0x83;			//使能除数锁存寄存器U0DLL,U0DLM;
                      // 1000 0011	   /bit8 enable access to the divisor latch
					    // bit0,bit1  word width select 11 8bit
  
  Fdiv=(Fpclk/16)/UART_br;	 //0<DIVADDVAL=0<15,1<MULVAL=1<15 -->U0FDR Resister;



  U0DLM=Fdiv/256;	//0x00 ;
  U0DLL=Fdiv%256;	 //0x82	;
  U0FDR=0x10;	   //3:0 DIVADDVAL;7:4 MULVAL 31:8 RESERVED
  U0LCR=0x03;	  //

  }

 /*****************receive data**************************
unsigned int UART0_GetByte()   //接收数据;
{ unsigned char rec;
   while((U0LSR&0x01)==0); //bit0=1,U0RBR包含有效数据;
   rec=U0RBR;			  //U0RBR接收缓冲寄存器;
   return(rec);
   }
void UART0_GetStr(unsigned char *s,unsigned int n)//接收一字符串;
{  for(;n>0;n--)
   { *s++=UART0_GetByte() ;
   }
}	 **/
/*******************send data************************/
void UART0_SendByte(unsigned char dat)		  //发送数据;
{   U0THR=dat;			 
   while((U0LSR&0x20)==0);	//bit5=0,U0THR包含有效数据;   bit6=0,both contain valid data;
  
}
void UART0_SendStr(unsigned char *str)		  //发送一字符串;
{  while(1)
    {  if(*str=='\0') break;
	   UART0_SendByte(*str++);
	   }
}

/*******************main funtion******************************/

int main()
{  UARTMODE set;
   set.datab=8;
   set.stopb=1;
   set.parity=0;
   rcv_new=0;
   PINSEL0=0x00000005;	
   UART0_Init(9600,set);
   U0FCR=0x81;				//使能FIFO,并设置触发点为八字节;
   U0IER=0x01;				//允许RBR中断,即接收中断;
   //中断初始化;

   VICIntSelect=0x00;	 //bit=0:Interrupt set as IRQ  ;bit=1  FIQ;
   VICVectCntl0=(0x20|0x06);
   VICVectAddr0=(unsigned int)IRQ_UART0;
   VICIntEnable=(1<<0x06);

   while(1){
     if(rcv_new==1)


	   {  rcv_new=0;
	      UART0_SendBuf();	//SN:F44G44444
		  }
		}
}




   




⌨️ 快捷键说明

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