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

📄 uart0.c

📁 用ARM7 LPC2292芯片驱动240128图形点阵液晶的源代码
💻 C
字号:
//========================================================================//
// 文件名:  UART0.c
// 作  者: xinqiang Zhang(小丑)  (email: xinqiang@Mzdesign.com.cn)
// 日  期: 2008/01/04
// 描  述: UART0模块的应用代码
//
// 参  考: 
// 版  本:
//      2008/01/04      First version    Mz Design
//========================================================================//
#include "LPC22xx.H"                        /* LPC22xx definitions */
#include "type.h"
#include "target.h"
#include "irq.h"
#include "uart0.h"

//DWORD UART0Status;
//BYTE UART0TxEmpty = 1;
BYTE UART0_Tx_Buf[BUFSIZE];			//发送数据缓存区
DWORD UART0_Tx_Index=0;				//当前发送数据的索引
BYTE UART0_Tx_flag=0;		//数据包发送标识
DWORD UART0_Tx_Counter=0;  			//实际发送的数据包中的数据个数
BYTE UART0_Rx_Buf[BUFSIZE];	 		//接收数据缓存区
BOOL UART0_Rx_flag=FALSE; 			//数据包接收完成标识,当然是在采用数据包形式的数据传输时才使用
DWORD UART0_Rx_Counter=0;			//接收数据缓冲区中的数据个数
//DWORD UART0Count = 0;
//========================================================================//
// 函数: void UART0Handler (void)
// 描述: UART0中断服务程序
// 参数: 无 
// 返回: 无
// 备注: 
// 版本:
//      2008/01/05      First version
//========================================================================//							  
void UART0Handler (void) __irq 
{
    BYTE IIRValue, LSRValue;
    BYTE Dummy;
	DWORD i=0;

    IENABLE;					//中断嵌套使能	
    IIRValue = U0IIR;			//读取UART0中断标识
    
    IIRValue &= 0x0e;			//仅保留有效的中断标识位
    if ( IIRValue == IIR_RLS )		//接收线状态 Receive Line Status 
    {
		LSRValue = U0LSR;			//读取线状态,同时会清零线状态
		if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )	//如果发生了任意一个错误则处理如下
		{
	 	   	Dummy = U0RBR;			//读数据接收缓冲寄存器会清除中断标识
	  	  	IDISABLE; 				//中断嵌套禁止
	  	  	VICVectAddr = 0;		// Acknowledge Interrupt 
	 	   	return;
		}
		if ( LSRValue & LSR_RDR )	//接收数据OK  Receive Data Ready 			
		{
	 	   	Dummy = U0RBR;
			if(UART0_Rx_Counter>=BUFSIZE)
			{
				for(i=0;i<BUFSIZE-1;i++)
					UART0_Rx_Buf[i] = UART0_Rx_Buf[i+1];

	 	   		UART0_Rx_Buf[BUFSIZE-1] = Dummy;
			}
			else UART0_Rx_Buf[UART0_Rx_Counter++] = Dummy;
			UART0_Rx_flag = TRUE;	
		}
    }
    else if ( IIRValue == IIR_RDA )	//接收数据可用  Receive Data Available 
    {
		Dummy = U0RBR;
		if(UART0_Rx_Counter>=BUFSIZE)
		{
			for(i=0;i<BUFSIZE-1;i++)
				UART0_Rx_Buf[i] = UART0_Rx_Buf[i+1];

	 	   	UART0_Rx_Buf[BUFSIZE-1] = Dummy;
		}
		else UART0_Rx_Buf[UART0_Rx_Counter++] = Dummy;
		UART0_Rx_flag = TRUE;
    }
    else if ( IIRValue == IIR_CTI )	//数据包接收超时 Character timeout indicator 
    {									//实际上就是使能FIFO时,在接收的队列当中的有效数据>=1时,在3.5~4.5个字符周期
										//之内没有发生FIFO的动作,则产生该中断
		Dummy = U0RBR;					//读数据以清中断
    }
    else if ( IIRValue == IIR_THRE )//发送移位寄存器空,即上一次发送完成并准备好了下一次发送 THRE, transmit holding register empty
    {
		LSRValue = U0LSR;			//检查状态寄存器,看是否在U0THR当中有有效数据存在
		if ( LSRValue & LSR_THRE )
		{ 								//可以发送
		   	if(UART0_Tx_Index<UART0_Tx_Counter) 
			{
				U0THR = UART0_Tx_Buf[UART0_Tx_Index++];
		//		U1IER &= ~0x02;//
			}
			else
			{
				UART0_Tx_flag = 0;	//当前发送状态标识清零
			}
		   
		}
    }
    
    IDISABLE;
    VICVectAddr = 0;		// Acknowledge Interrupt 
}

//========================================================================//
// 函数: void UART0Init(DWORD baudrate)
// 描述: UART0初始化函数
// 参数: baudrate	要设置的波特率 
// 返回: 无
// 备注: 
// 版本:
//      2008/01/05      First version
//========================================================================//
void UART0Init(DWORD baudrate)
{
	DWORD Fdiv;

	PINSEL0 &= ~0x0000000f;  		//Enable RX0 TX0 port of UART0 
	PINSEL0 |= 0x00000005;
	U0LCR = 0x83;					//设置8位数据模式,一个停止位,无奇偶校验
	
	Fdiv = ( Fpclk / 16 ) / baudrate ;	
    U0DLM = Fdiv / 256;							
    U0DLL = Fdiv % 256;	 

	install_irq( UART0_INT, (void *)UART0Handler );
	U0LCR &= ~0x80;
//	U0FCR |= 0x01;
//	U0FCR |= 0x40; 
	U0IER = 0x07;					//打开UART0的中断
}

//========================================================================//
// 函数: void UART0Send(BYTE *BufferPtr, DWORD Length )
// 描述: UART0数据包发送函数
// 参数: BufferPtr	要发送的数据的首地址
//		 Length		要发送的数据的个数 
// 返回: 无
// 备注: 
// 版本:
//      2008/01/05      First version
//========================================================================//
void UART0Send(BYTE *BufferPtr, DWORD Length )
{
	while(UART0_Tx_flag);			//等待发送完毕
    if(Length<=BUFSIZE)
	{
		//装载数据包的数据至发送缓冲区
		for(UART0_Tx_Counter=0;UART0_Tx_Counter< Length;UART0_Tx_Counter++)
			UART0_Tx_Buf[UART0_Tx_Counter] = *BufferPtr++;
		UART0_Tx_Index = 0;			//索引清零
		UART0_Tx_flag = 1;			//发送标识置1
		U0THR = UART0_Tx_Buf[UART0_Tx_Index++];
	}
	else return;
}

⌨️ 快捷键说明

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