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

📄 uart0_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 "UART0_V1.0.h"

uint8  byU0RcvBufTemp[24];       		// UART0数据接收缓冲区
uint8  byU0RcvBuf[24];       		// UART0数据接收缓冲区
uint8  byU0RcvCounter;
uint16 iU0RcvTimer;
uint8  byU0RcvBufOK;     	// 信息移走标志位

volatile uint8  myU0IIR;
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART0(void)
{  
	uint8  i;
	uint8 byTemp;
    
    myU0IIR = U0IIR&0x0F;
    
    if( myU0IIR == 0x04 )
   	{
   		byTemp = U0RBR;
   		
   		if(iU0RcvTimer>UART0_OVERTIME)
   		{
   			if(byU0RcvBufOK==0)
   			{
   				for(i=0;i<24;i++)
   					byU0RcvBuf[i]=byU0RcvBufTemp[i];
   				byU0RcvBufOK=1;
   			}
   		
   			byU0RcvCounter = 0;
   			byU0RcvBufTemp[byU0RcvCounter] = byTemp;
   			byU0RcvBufOK=0;
   		}
   		else
   		{	
   			byU0RcvCounter ++ ;
   			byU0RcvBufTemp[byU0RcvCounter] = byTemp;
   		}

   		iU0RcvTimer=0;
   	}
   	else if( myU0IIR == 0x0C )	//字符超时提示
   	{
   		myU0IIR = U0IIR&0x0F;
   	}
   	else if( myU0IIR == 0x06 )	//RX线状态错误,OE,PE,FE,或 BI
   	{
   		myU0IIR = U0IIR&0x0F;
   	}
   	else if( myU0IIR == 0x02 )	//THRE 中断
   	{
   		myU0IIR = U0IIR&0x0F;
   	}
   	else	//其他中断
   	{
   		myU0IIR = U0IIR&0x0F;
   	}
   
	VICVectAddr = 0x00;              	// 中断处理结束
} 

/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud            波特率
*           databit			设置字长度,5-8位
            stopbit			设置停止位,1:1位停止位,2:2位停止位。
            parity          设置奇偶校验位, 0:没有奇偶校验,1:奇校验,2:偶校验
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART0_Ini(uint32 baud, uint8 databit, uint8 stopbit, uint8 parity)
{  
	uint32  bak;
	
	PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | 0x05;
  	
	/* 参数过滤 */
   	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);

   	/* 设置串口波特率 */
   	U0LCR = 0x80;                        // DLAB位置1
   	bak = (Fpclk>>4)/baud;
   	U0DLM = bak>>8;
   	U0DLL = bak&0xff;
   
   	/* 设置串口模式 */
   	bak = databit-5;                   // 设置字长度
   	if(2==stopbit) bak |= 0x04;        // 判断是否为2位停止位  
  	 
   	if(0!=parity) {parity = parity-1; bak |= 0x08;}
   	bak |= parity<<4;              	// 设置奇偶校验
      
   	U0LCR = bak;
   
//   	U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
   	U0FCR = 0x01;                        // 使能FIFO,并设置触发点为1字节
   	U0IER = 0x01;                        // 允许RBR中断,即接收中断
   
   	/* 设置中断允许 */
   	VICIntSelect = VICIntSelect & 0x00000000;       // 设置所有通道为IRQ中断
   	VICVectCntl0 = 0x20 | 0x06;                 	// UART0中断通道分配到IRQ slot 0,即优先级最高
   	VICVectAddr0 = (int)IRQ_UART0;       // 设置UART0向量地址
   	VICIntEnable = 0x00000040;           // 使能UART0中断
   
   	//my code
   	byU0RcvCounter=0;
   	iU0RcvTimer =3001;
   	byU0RcvBufOK=1;
   	return(1);
}

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

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

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

	SendByte(byBufLength+4);
	iCheck = byBufLength+4;
	while( (U0LSR&0x20)==0 );         	// 等待数据发送缓冲区为空

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

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

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

⌨️ 快捷键说明

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