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

📄 uart.c

📁 基于LPC2119的CAN驱动及例子 循环发送实例程序 简单的CAN中继器实例
💻 C
字号:
/*
****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        CAN开发组 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: UART.H
**创   建   人: 滕欣欣
**最后修改日期: 2004年5月01日
**描        述: UART的基本操作函数
**
********************************************************************************************************
*/
#define	_UART_GLOBAL_
#include "..\..\src\config.h"
/*
**************************************
	   定义配置常量
**************************************
*/
#define	UART0Int			1
#define	UART0Int_Vec		1
#define	UART1Int			0
#define	UART1Int_Vec		0

/*
*********************************************************************************************************
** 函数名称:	void UARTInit (eUARTNUM UARTNum)     
** 全局变量: 	无
** 作   者:    滕欣欣
** 日   期:    2004年5月02日
** 描    述:	UART初始化
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描  述: 		
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void UARTInit (eUARTNUM UARTNum)
{
	INT32U	i;									//设置管脚连接
	i	= PINSEL0;
	i	= i&0xFFFFFFF0;
	PINSEL0	= i |0x05;

	UARTLCR(UARTNum).DLABAcceEn	= 1;		//设置通讯波特率,先把DLAB置"1"

	UARTDLM(UARTNum).DLM	= 0x00; 			//根据(UARTDLM UARTDLL) = Fclk/(16*baud),计算的出在4*11.0592Mhz主频下
	UARTDLL(UARTNum).DLL	= 0x18;			//要的到 115200 波特率的分频值为 0x18

	UARTLCR(UARTNum).DLABAcceEn	= 0;		//DLAB置"0"

	UARTLCR(UARTNum).WordLen	= 3;	//设置数据位为8
	UARTLCR(UARTNum).Stop		= 0;	//停止位位"1"
	UARTLCR(UARTNum).ParityEnable	= 0;		//无奇偶校验
	U0FCR = 0x01;
	UARTIER(UARTNum).ERxDA		= 1;	//使能接收中断
	
	if (UARTNum == UART0)
	{
		#if UART0Int
			#if	UART0Int_Vec
			VICVectCntl6	= 0x20|6;
			VICVectAddr6	= (INT32U)UART0ISR;
			#endif
		VICDefVectAddr	= (INT32U)CANIntPrg;
		VICIntEnable	= 1<<6;
		#endif
	}
	else
	{	
		#if UART1Int
			#if	UART0Int_Vec
			VICVectCntl7	= 0x20|7;
			VICVectAddr7	= (INT32U)UART1ISR;
			#endif
		VICDefVectAddr	= (INT32U)NVectorInt;
		VICIntEnable	= 1<<7;
		#endif
	}
	
	
}

/*
*********************************************************************************************************
** 函数名称:	void	UARTSend(INT32U Len,INT8U *Buf)    
** 全局变量: 	无
** 作   者:    滕欣欣
** 日   期:    2004年5月02日
** 描    述:	UART数据发送程序
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描  述: 		
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void	UARTSend(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
{
	INT32U i,j,k;
	INT8U *p =Buf;
	i= Len/16;
	j=Len%16;
	while(i--> 0)
	{
		for(k=0;k<16;k++)
		{
			UARTTHR(UARTNum).WritedData=(*p++);
		}
		while(!(U0LSR&0x20));
	}
	for(k=0;k<j;k++)
	{
		UARTTHR(UARTNum).WritedData =(*p++);
	}
	while(!(U0LSR&0x20));
}

/*
************************************************************************************************************************
**函数原型	:  	void UARTRcv(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
**参数说明	:  	Len		-->>	接收字符长度;<=16;
				Buf		-->>	解收数据的缓冲区首址
**返回	值	:	无
**说	明	:	本函数用于UART0接收数据,应用FIFO
************************************************************************************************************************
*/
void UARTRcv(eUARTNUM UARTNum,INT32U Len,INT8U *Buf)
{
	INT32U i,j;
	if(Len >16)
	{
		i=16;
	}
	else
	{
		i=Len;
	}
	for(j=0;j<i;j++)
	{
		*(Buf+j) = UARTRBR(UARTNum).WritedData;	
	}
}
/*
*********************************************************************************************************
** 函数名称:	void UARTxISR (void)     
** 全局变量: 	无
** 作   者:    滕欣欣
** 日   期:    2004年5月02日
** 描    述:	UART中断服务程序
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描  述: 		
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************
*/
void 	UART0ISR (void)
{
	INT32U	i;
	if (0x04 != (0x0f&U0IIR))
	{
		UARTRcvCounter = 0;
		UARTRcvNewData = 0;
		U0FCR = 0x01;
		goto ExitUartInt;
	}
	switch (UARTRcvCounter)
	{
		case 0:
			SRBuf[0] = U0RBR;
			if (SRBuf[0] == 0x12)
				UARTRcvCounter++;
			goto ExitUartInt;
		case 1:
			SRBuf[1] = U0RBR;
			UARTRcvCounter++;
			goto ExitUartInt;
		case 2:
			SRBuf[2] = U0RBR;
			U0FCR = 0x41;
			UARTRcvCounter++;
			goto ExitUartInt;
		case 3:
			for (i = 0; i<4; i++)
			{
				SRBuf[3 + i ] = U0RBR;
			}
			U0FCR = 0x81;
			UARTRcvCounter++;
			goto ExitUartInt;
		case 4:
			for (i = 0; i<8; i++)
			{
				SRBuf[7 + i ] = U0RBR;
			}
			U0FCR = 0x01;
			UARTRcvCounter++;
			goto ExitUartInt;
		case 5:
			SRBuf[15 ] = U0RBR;
			U0FCR = 0x01;
			UARTRcvCounter++;
			goto ExitUartInt;
		case 6:
			SRBuf[16 ] = U0RBR;
			U0FCR = 0x01;
			UARTRcvCounter = 0;
			UARTRcvNewData = 1;
			goto ExitUartInt;		
	}
ExitUartInt:
	VICVectAddr = 0;										
}
/*
**********************************************************************************************************
**                            End Of File
**********************************************************************************************************
*/

⌨️ 快捷键说明

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