📄 uart1_v1.0.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 + -