www.pudn.com > sdsource.rar > uart.c


 
 
#include "config.h" 
#include "uart.h" 
 
uint8 rcv_buf[8];						// UART0数据接收缓冲区 
volatile uint8 rcv_new;					// 接收新数据标志 
 
/* 
********************************************************************************************************* 
** 函数名称 : Uart_Initialize() 
** 函数功能 : 初始化Uart的相关工作,包括初始Uart0端口,设置波特率和Uart0中断向量地址等 
** 入口参数 : uint32 baudrate: Uart0 波特率 
** 出口参数 : 无 
********************************************************************************************************* 
*/ 
void Uart_Initialize(uint32 baudrate) 
{ 
	UARTMODE set; 
	 
	set.datab  = 8; 
	set.stopb  = 1; 
	set.parity = 0; 
	 
	rcv_new = 0; 
	 
	PINSEL0 &= 0xFFFFFFF0; 
	PINSEL0 |= 0x00000005;				// 设置I/O连接到UART0 
	 
	UART0_Init(baudrate, set);			// 串口初始化 
	U0FCR = 0x81;						// 使能FIFO,并设置触发点为8字节 
	U0IER = 0x01;						// 允许RBR中断,即接收中断 
	 
	IRQEnable();						// 使能IRQ中断 
	/* 使能UART0中断 */ 
	VICIntSelect = 0x00000000;			// 设置所有的通道为IRQ中断 
	VICVectCntl0 = 0x20 | 0x06;			// UART0分配到IRQ slot0,即最高优先级 
	VICVectAddr0 = (uint32)IRQ_UART0;	// 设置UART0向量地址 
	VICIntEnable = 1 << 0x06;			// 使能UART0中断 
} 
 
/* 
********************************************************************************************************* 
** 函数名称 :IRQ_UART0() 
** 函数功能 :串口0接收中断服务程序 
** 入口参数 :无 
** 出口参数 :无 
********************************************************************************************************* 
*/ 
void __irq IRQ_UART0 (void) 
{ 
	uint8 i; 
	 
	if ((U0IIR & 0x0F) == 0x04)	 
		rcv_new = 1;					// 设置接收到新的数据标志 
 
	for (i = 0; i < 8; i++) 
	{ 
		rcv_buf[i] = U0RBR;				// 读取FIFO的数据,并清除中断	 
	} 
	VICVectAddr = 0x00;					// 中断处理结束 
} 
 
/* 
********************************************************************************************************* 
** 函数名称 :UART0_SendByte() 
** 函数功能 :向串口0发送1字节数据 
** 入口参数 :dat	要发送的数据 
** 出口参数 :无 
********************************************************************************************************* 
*/ 
void UART0_SendByte (uint8 dat) 
{ 
	U0THR = dat;	// 要发送的数据 
} 
 
/* 
********************************************************************************************************* 
** 函数名称 :UART0_SendBuf() 
** 函数功能 :向串口发送8字节数据 
** 入口参数 :dat	要发送的数据 
** 出口参数 :无 
********************************************************************************************************* 
*/ 
void UART0_SendBuf (void) 
{ 
	uint8 i; 
	 
	for (i=0; i<8; i++) 
		UART0_SendByte(rcv_buf[i]); 
	while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕 
} 
 
/* 
********************************************************************************************************* 
** 函数名称 :UART0_Init() 
** 函数功能 :串口初始化,设置工作模式和波特率。 
** 入口参数 :baud	波特率 
**			  set	模式设置(UARTMODE数据结构) 
** 出口参数 :1-初始化成功,  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;						// DLAB = 1	 
	bak   = (Fpclk >> 4) / baud; 
	U0DLM = bak >> 8; 
	U0DLL = bak & 0xFF; 
	 
	/* 设置串口模式 */ 
	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); 
}