?? uartvic.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 + -