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

📄 uart1_v1.0.c

📁 驾驶员考试电桩考试系统的车载程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               长春智君电子有限公司
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: IRQ_FIQ_handle.c
**创   建   人: 查立军
**最后修改日期: 2006年11月24日
**描        述: 中断处理程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 查立军
** 版  本: 1.0
** 日 期: 2006年11月24日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**--------------功能说明------------------------------------------------------------------------------
** 关于接收:
   在主函数里,可以看到两个缓冲区:uint8  byU0RcvBufTemp[24];  uint8  byU0RcvBuf[24];
               还有 iU0RcvTimer; 用来识别字串的中缝,以区分各个字串。
   
   识别字串缝隙的方法:在主函数中,如果"iU0RcvTimer>UART0_OVERTIME",则说明出现了中锋,
                                   然后,把缓冲区byU0RcvBufTemp[24]里的信息,移动到缓冲区byU0RcvBuf[24]
                                         同时把标志位byU0RcvBufOK置为1。
   ---------------------------------------------------------------------------------------------------
   关于发送:            
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "UART1_V1.0.h"

uint8  byU1RcvBufTemp[24];       		// UART1数据接收缓冲区1
uint8  byU1RcvBuf[24];       			// UART1数据接收缓冲区2
//uint8  ErrorSendBuf[2];						// UART1错误信息的发送缓冲区
uint8  byU1RcvCounter;		//接收数据的计数器
uint8  byU1RcvBufOK;     	//信息移走标志位
uint8  byUART1_RcvFlag;		//UART1的通信错误汇总。

volatile uint8  myU1IIR;
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART1(void)
{  
	uint8  i;
	uint8 byTemp;
    
    myU1IIR = U1IIR&0x0F;		//取得中断类型代码
    
    if( myU1IIR == 0x04 )		//是接收到字符中断
   	{
   		byTemp = U1RBR;
   		
   		if(byU1RcvCounter==0)
   		{
   			if(byTemp==0x55)
	   			byU1RcvCounter=1;
	   		else
	   			byUART1_RcvFlag=byUART1_RcvFlag | 0x01;
   		}
   		else if(byU1RcvCounter==1)
   		{
   			if(byTemp==0x5A)
	   			byU1RcvCounter=2;
	   		else
	   		{
	   			byUART1_RcvFlag=byUART1_RcvFlag | 0x02;
				byU1RcvCounter = 0;
	   		}
   		}
   		else if(byU1RcvCounter==2)
   		{
   			if(byTemp==0x01)
	   			byU1RcvCounter=3;
	   		else
	   		{
	   			byUART1_RcvFlag=byUART1_RcvFlag | 0x04;
				byU1RcvCounter = 0;
	   		}
   		}
   		else if(byU1RcvCounter==3)
   		{
   			if(byTemp < 7)
	   		{
	   			byUART1_RcvFlag=byUART1_RcvFlag | 0x08;
				byU1RcvCounter = 0;
	   		}
	   		else if (byTemp > 24)
	   		{
	   			byUART1_RcvFlag=byUART1_RcvFlag | 0x10;
				byU1RcvCounter = 0;
	   		}
	   		else
	   		{
	   			byU1RcvBufTemp[3]=byTemp-1;
	   			byU1RcvCounter=4;
	   		}
   		}
   		else
   		{
   			if(byU1RcvCounter<byU1RcvBufTemp[3])
   			{
   				byU1RcvBufTemp[byU1RcvCounter] = byTemp;
	   			byU1RcvCounter++;
   			}
   			else if(byU1RcvCounter==byU1RcvBufTemp[3])
   			{
	   			if(byU1RcvBufOK==0)			//如果MAIN函数已经处理完上一个字符串,
	   			{							//则把此字符串放入待处理缓冲区并复位,
	   				for(i=0;i<byU1RcvCounter;i++)
	   					byU1RcvBuf[i]=byU1RcvBufTemp[i];
	   				byU1RcvBuf[byU1RcvCounter]=byTemp;
	   				byU1RcvBuf[3]++;
	   				byU1RcvBufOK=1;				//"存在待处理字符的标志"置位
	   			}
	   			else						//否则放弃本字符串,并复位。
	   			{
		   			byUART1_RcvFlag=byUART1_RcvFlag | 0x20;
	   			}
	   			byU1RcvCounter = 0;				//"临时缓冲区"的计数器复位。
   			}
   			else
   			;
   		}
   	}
   	else if( myU1IIR == 0x0C )	//字符超时提示
   	{
   		myU1IIR = U1IIR&0x0F;
   	}
   	else if( myU1IIR == 0x06 )	//RX线状态错误,OE,PE,FE,或 BI
   	{
   		myU1IIR = U1IIR&0x0F;
   	}
   	else if( myU1IIR == 0x02 )	//THRE 中断
   	{
   		myU1IIR = U1IIR&0x0F;
   	}
   	else						//其他中断
   	{
   		myU1IIR = U1IIR&0x0F;
   	}
   
	VICVectAddr = 0x00;              	// 中断处理结束
} 

/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud            波特率
*           databit			设置字长度,5-8位
            stopbit			设置停止位,1:1位停止位,2:2位停止位。
            parity          设置奇偶校验位, 0:没有奇偶校验,1:奇校验,2:偶校验
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART1_Ini(uint32 baud, uint8 databit, uint8 stopbit, uint8 parity)
{  
	uint32  bak;
	
	PINSEL0 = (PINSEL0 & 0xFFF0FFFF) | 0x00050000;	//.19.18.17.16=0101		P0.9 P0.8 is TxD RxD 	
  	
	/* 参数过滤 */
   	if( (0==baud)||(baud>115200) ) return(0);
   	if( (databit<5)||(databit>8) ) return(0);
   	if( (0==stopbit)||(stopbit>2) ) return(0);
   	if( parity>4 ) return(0);

   	/* 设置串口波特率 */
   	U1LCR = 0x80;                        // DLAB位置1
//	U1LCR = 0x83;
   	bak = (Fpclk>>4)/baud;
   	U1DLM = bak>>8;
   	U1DLL = bak&0xff;
   
   	/* 设置串口模式 */
   	bak = databit-5;                   // 设置字长度
   	if(2==stopbit) bak |= 0x04;        // 判断是否为2位停止位  
  	 
   	if(0!=parity) {parity = parity-1; bak |= 0x08;}
   	bak |= parity<<4;              	// 设置奇偶校验
      
   	U1LCR = bak;
   
//   	U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
   	U1FCR = 0x01;                        // 使能FIFO,并设置触发点为1字节
   	U1IER = 0x01;                        // 允许RBR中断,即接收中断
   
   	/* 设置中断允许 */
   	VICIntSelect = VICIntSelect & 0x00000000;       // 设置所有通道为IRQ中断
   	VICVectCntl1 = 0x20 | 0x07;                 	// UART1中断通道分配到IRQ slot 0,即优先级最高
   	VICVectAddr1 = (int)IRQ_UART1;       // 设置UART1向量地址
   	VICIntEnable = 0x00000080;           // 使能UART1中断
   
   	//my code
   	byU1RcvCounter=0;
   	byU1RcvBufOK=0;
   	byUART1_RcvFlag=0;
   	byU1RcvBufTemp[0] = 0x55;
   	byU1RcvBufTemp[1] = 0x5A;
   	byU1RcvBufTemp[2] = 0x01;
   	byUART1_RcvFlag=0;
   	return(1);
}

/****************************************************************************
* 名称:UART1_SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  UART1_SendByte(uint8 data)
{  U1THR = data;                      	// 发送数据
}

/****************************************************************************
* 名称:UART1_ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:
			uint8 byAddr,		车载的地址
			uint8 byCommand,	需要发送的命令
			uint8 * bySendBuf,	发送缓存区
			uint8 byBufLength	缓存区中有效数据的长度
* 出口参数:无
****************************************************************************/
void UART1_ISendBuf(uint8 byAddr,uint8 byCommand,uint8 * bySendBuf,uint8 byBufLength)
{  
	uint8  i;
	//uint8  bySendNumber=byLength-4;
	uint16  iCheck=0;
	
	UART1_SendByte(0x55);
	while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空
	UART1_SendByte(0x5A);
	while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空

	UART1_SendByte(byAddr);
	while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空

	UART1_SendByte(byBufLength+7);
	iCheck = byBufLength+7;
	while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空

	UART1_SendByte(byCommand);
	iCheck += byCommand;
	while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空

   	for(i=0;i<byBufLength;i++)
   	{
   		UART1_SendByte(bySendBuf[i]);
   		iCheck += bySendBuf[i];
   		while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空
   	}
   	
   	i=iCheck/256;
   	UART1_SendByte(i);
	while( (U1LSR&0x20)==0 );         	// 等待数据发送缓冲区为空
   	i=iCheck%256;
   	UART1_SendByte(i);
}               

/****************************************************************************
* 名称:UART1_CheckRcvData(uint8 * byBuf)
* 功能:检查从主机发来的串口信息是否正确.
* 入口参数:
			uint8 * byBuf,	缓存区
* 出口参数:uint8 如果检查合格则返回0,否则返回错误代码1到5
					1: 参数byBufLength不正确,
					2: 头一个字符不正确 0x55
					3: 第二个字符不正确 0x5A
					4: 地址不正确      
					5: 长度信息不正确
					6: 校验和不正确
****************************************************************************/
uint8 UART1_CheckRcvData(uint8 * byBuf)
{  
	uint8 i;
	uint16 u16Temp;
	
//	if(byBuf[0]!=0x55) return 1;
//	if(byBuf[1]!=0x5A) return 2;
//	if(byBuf[2]!=0x01) return 3;
//	if(byBuf[3]<7) return 4;
	
	u16Temp=0;
	for(i=3;i<byU1RcvBuf[3]-2;i++)
		u16Temp = u16Temp + byBuf[i];
		
	if( (byBuf[byU1RcvBuf[3]-1]+byBuf[byU1RcvBuf[3]-2]*256) != u16Temp ) return 5;
	return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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