📄 uart0_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 "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 + -