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

📄 uart0app.c

📁 一个CAN总线应用的sample ,采用LPC2119处理器.
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: UART0APP.C
**创   建   人: 刘养海
**最后修改日期: 2004年2月25日
**描        述: 定义LPC21xx\LPC22xx中UART0应用层函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 刘养海
** 版  本: v1.0
** 日 期: 2004年2月25日
** 描 述: 原始版本
**

**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define		_UART0APP_GLOBAL_

//文件引用
#include "config.h"
#include "global.h"


//#define	Fpclk  11059200
/*********************************************************************************************************
**--------------技巧说明------------------------------------------------------------------------------
** 在文件中定义了用于UART0实际应用层操作的函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

/*
************************************************************************************************************************
**函数原型	:  	void		Delay(UINT32 i)
**参数说明	:  	i;软件Delay
**返回	值	:	无
**说	明	:	本函数用于简单的延时
*****
*******************************************************************************************************************
*/
void		Delay(UINT32 i)
{
	while(i--);
}
//用下面的有限状态机实现
/*
	-->0--$--1
	1--A--2--6 char--0   炮塔角度传感器
	...     ...  	
	A	炮塔角度传感器8
	B	炮塔电源
	C	火控制接口装置33
	D	光电对抗设备
	E	工矿采集设备
	F	毫米波信道机50
	G	GPS定位设备
	H	惯性导航设备
	I	车载电源(直流)35
	J	车载电源(交流)9
*/
#if 0
#define A_LEN 8
#define B_LEN 0
#define C_LEN 33
#define D_LEN 0
#define E_LEN 50
#define F_LEN 0
#define G_LEN 79
#define H_LEN 0
#define I_LEN 35
#define J_LEN 9
void   __irq IRQ_UART0(void)
{
   if( (0x04==(U0IIR&0x0F)) && (CanSendFlag == 0)) 
	switch(UartStatus)
	{

		case	0:
			RcvCounter=0;
			if((UINT8)uU0RBR.Word == 0x24)
			{
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
				UartStatus++;
			}
			HC595_SendDat(DISP_TAB[0]);
			break;
		case	1:
			HC595_SendDat(DISP_TAB[1]);
			SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			DeviceID = (UINT8)uU0RBR.Word; 
			UartStatus = DeviceID - 63;       //因为63='A'-2
			break;
		case	2://	A	炮塔角度传感器
			HC595_SendDat(DISP_TAB[2]);
			if(RcvCounter < A_LEN-1)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[A_LEN-1]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
		case	3://	B	炮塔电源
			break;
		case	4://	C	火控制接口装置
			if(RcvCounter < C_LEN)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A );
				{
					SRBuf[C_LEN-1]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
		case	5://	D	光电对抗设备
			break;
		case	6://	E	工矿采集设备
			if(RcvCounter < E_LEN)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[E_LEN-1]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
		case	7://	F	毫米波信道机
			break;
			
		case	8://	G		GPS定位设备
			SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			if((UINT8)uU0RBR.Word == 'P' )
				UartStatus=12;
			else
			{
				UartStatus=0;
				RcvCounter = 0;
			}
			break;

		case	12://	GP		GPS定位设备
			SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			if((UINT8)uU0RBR.Word == 'G' )
				UartStatus=13;
			else
			{
				UartStatus=0;
				RcvCounter = 0;
			}
			break;
		case	13://	GPG		GPS定位设备
			SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			if((UINT8)uU0RBR.Word == 'G' )
				UartStatus=14;
			else
			{
				UartStatus=0;
				RcvCounter = 0;
			}
			break;
		case	14://	GPGG	GPS定位设备
			SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			if((UINT8)uU0RBR.Word == 'A' )
				UartStatus=15;
			else
			{
				UartStatus=0;
				RcvCounter = 0;
			}
			break;
		case	15://	GPGGA	GPS定位设备
			if(RcvCounter < G_LEN)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[G_LEN-1]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
			
		case	9://	H	惯性导航设备
			break;
		case	10://I	车载电源(直流)
			if(RcvCounter < I_LEN)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[I_LEN-1]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
		case	11://J	车载电源(交流)
			if(RcvCounter < J_LEN)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[J_LEN-1]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
		default:
			tmp = (UINT8)uU0RBR.Word; 
			UartStatus=0;
			CanSendFlag =0;       
			RcvCounter = 0;
			break;
	}

   VICVectAddr = 0x00;              	// 中断处理结束
}               

/*
************************************************************************************************************************
**函数原型	:  	void		InitUart0(UINT32 BPS)
**参数说明	:  	BPS		-->>	BandRate;
				LCR		-->>	U0LCR 寄存器;
				FCR		-->>	UOFCR 寄存器;
**返回	值	:	无
**说	明	:	本函数用于硬件初始化UART0
************************************************************************************************************************
*/
void		InitUart0(UINT32 BPS)
{
	PCONP |= (0x01 << 3) ;
	PINSEL0 &= ~((UINT32)0x0F); 
	PINSEL0 |= ((UINT32)0x05);
	//设定波特率
	U0LCR =0x80;
	U0DLL=Fpclk/(16*BPS)&0x000000ff;
	U0DLM=(Fpclk/(16*BPS)) >>8;
	uU0LCR.Bits.DLAB_BIT =0x00;
	//在此加入自己的初始化代码
	U0LCR =0x03;
	U0FCR =0x01;//0xC1;
	U0IER = 0x01; //允许接收中断

	/* 设置中断允许 */
	VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断
	VICVectCntl0 = 0x26;                 // UART0中断通道分配到IRQ slot 0,即优先级最高
	VICVectAddr0 = (int)IRQ_UART0;       // 设置UART0向量地址
	VICIntEnable = 0x00000040;           // 使能UART0中断


}
#endif

/*
************************************************************************************************************************
**函数原型	:  	void		Uart0Send(UINT32 Len,UINT8 *Buf)
**参数说明	:  	Len		-->>	发送字符长度;
				Buf		-->>	要发送数据的缓冲区首址
**返回	值	:	无
**说	明	:	本函数用于UART0发送数据,应用FIFO,非发送中断方式
************************************************************************************************************************
*/
void	Uart0Send(UINT32 Len,UINT8 *Buf)
{
	UINT32 i,j,k;
	UINT8 *p =Buf;
	i= Len/16;
	j=Len%16;
	while(i--)
	{
		for(k=0;k<16;k++)
		{
			uU0THR.Word=(UINT32)(*p++);
		}
		while(0 == (U0LSR &0x40));
	}
	for(k=0;k<j;k++)
	{
		uU0THR.Word=(UINT32)(*p++);
	}
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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