?? 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 + -