K7i ARM开发板源码之UART通信(中断方式)
/**************************************************************************************************************************
* 文件名:main.c
* 功 能:UART通信(中断方式) 通过超级终端向开发板发送数据,开发板接收数据后再发给电脑.
* 作 者:李园
* 日 期:2008年5月16号
* 博 客:blog.csdn.net/liyuanempire
*************************************************************************************************************************/
#include "config.h"
typedef struct UartMode
{
uint8 datab;
uint8 stopb;
uint8 parity;
}UARTMODE;
uint8 rcv_buf[8];
volatile uint8 rcv_new;
void __irq IRQ_UART0(void)
{
uint8 i;
if((U0IIR&0x0F)==0x04)
rcv_new=1;
for(i=0;i<8;i++)
{
rcv_buf[i]=U0RBR;
}
VICVectAddr=0x00;
}
void UART0_SendByte(uint8 dat)
{
U0THR=dat;
}
void UART0_SendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
UART0_SendByte(rcv_buf[i]);
while ((U0LSR&0x20)==0);
}
int8 UART0_Init(uint32 baud,UARTMODE set)
{
uint32 bak;
if((baud==0)||(baud>115200)) 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=0x80;
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xFF;
bak=set.datab-5;
if(set.stopb==2) bak|=0x04;
if(set.parity!=0)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U0LCR=bak;
return(1);
}
int main (void)
{
UARTMODE set;
set.datab=8;
set.stopb=1;
set.parity=0;
rcv_new=0;
PINSEL0=0x00000005;
UART0_Init(9600,set);
U0FCR=0x81;
U0IER=0x01;
IRQEnable();
VICIntSelect=0x00000000;
VICVectCntl0=0x20|0x06;
VICVectAddr0=(uint32)IRQ_UART0;
VICIntEnable=1<<0x06;
while(1)
{
if(rcv_new==1)
{
rcv_new=0;
UART0_SendBuf();
}
}
return 0;
}