#include <LPC213x.h>
//#define Fpclk 11059200/4 //晶振是11.0592M,没有配置PLL和VPB分频器,故为默认值
#define Fpclk 12000000*5 //晶振是12M,
/********************************************************************
定义串口模式设置数据结构
********************************************************************/
typedef struct uartmode
{
unsigned char datab; //字长度,5/6/7/8可选
unsigned char stopb; //停止位,1/2可选
unsigned char parity; //奇偶校验位,0无1奇2偶
}UARTMODE;
unsigned char rcv_buf[8]; //UART数据接收缓冲区
volatile unsigned char rcv_new;//接收新数据标志
/***************************************************************************
函数名称:IRQ_UART()
函数功能:串口0接收中断服务程序
入口参数:无
出口参数:无
***************************************************************************/
void IRQ_UART (void) __irq
{
unsigned char i;
if((U0IIR & 0x0F) == 0x04)
rcv_new = 1; //设置接收到新的数据标志
for(i = 0; i < 8; i ++) //FIFO使能时设为8字节长度
{
rcv_buf[i] = U0RBR; //读取FIFO的数据,并清除中断
}
VICVectAddr = 0x00; //中断处理结束,更新硬件优先级
}
/***************************************************************************
函数名称:UART_SendByte()
函数功能:向串口发送字节数据
入口参数:dat 要发送的数据
出口参数:无
***************************************************************************/
void UART_SendByte(unsigned char dat)
{
U0THR = dat;
}
/*************************************************************************************
函数名称:UART_SendBuf()
函数功能:向串口发送8字节数据
入口参数:无
出口参数:无
*************************************************************************************/
void UART_SendBuf(void)
{
unsigned char i;
for(i = 0;i <8; i++)
UART_SendByte(rcv_buf[i]);
while((U0LSR & 0x20) == 0); //等待数据发送完毕
}
/*************************************************************************************
函数名称:UART_Init()
函数功能:串口初始化,设置工作模式和波特率
入口参数:baud 波特率
set 模式设置
出口参数:1为初始化成功 0为初始化失败
*************************************************************************************/
unsigned char UART_Init(unsigned long baud,UARTMODE set)
{
unsigned long bak;
/**参数过滤**/
if((baud == 0)||(baud > 115200)) return(0);
if((set.datab < 5)||(set.datab > 8)) return(0);
if((baud == 0)||(baud > 115200)) return(0);
if((set.parity > 4)) return(0);
/**设置串口波特率**/
U0LCR = 0x80; //DLAB = 1
bak = (Fpclk /64)/baud;
U0DLM = bak >>8;
U0DLL = bak & 0xff;
// U0DLM = 0x00;
// U0DLL = 0x12;
/* 设置串口模式 */
bak = set.datab-5; // 设置字长度
if(set.stopb==2)
{
bak |= 0x04; // 判断是否为2位停止位
}
if(set.parity!=0)
{
set.parity = set.parity-1;
bak |= 0x08;
}
bak |= set.parity<<4; // 设置奇偶校验
U0LCR = bak;
return(1);
}
/*************************************************************************************
函数名称:main()
函数功能:从串口接收字符串,并送回上位机显示
*************************************************************************************/
int main()
{
UARTMODE set;
set.datab = 8; //字长度8位
set.stopb = 1; //1位停止位
set.parity = 0; //无奇偶校验
rcv_new = 0;
PINSEL0 = (PINSEL0 & (~0x0F))|0x05; //设置I/O连接到UART0
UART_Init(9600,set);
U0FCR = 0x81; //使能FIFO,并设置触发点为8字节
U0IER = 0x01; //允许RBR中断
VICIntSelect = 0x00000000; //设置所有通道为IRQ中断
VICVectCntl0 = 0x20|0x06; //UART0分配到IRQ slot0,即具有最高优先级
VICVectAddr0 = (unsigned long)IRQ_UART; //设置UART的向量地址
VICIntEnable = 1<<0x06; //使能UART中断
while(1)
{
if(rcv_new == 1)
{
rcv_new = 0;
UART_SendBuf();
}
}
}