?? uart0.c
字號:
//========================================================================//
// 文件名: UART0.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2008/01/04
// 描 述: UART0模塊的應用代碼
//
// 參 考:
// 版 本:
// 2008/01/04 First version Mz Design
//========================================================================//
#include "LPC22xx.H" /* LPC22xx definitions */
#include "type.h"
#include "target.h"
#include "irq.h"
#include "uart0.h"
//DWORD UART0Status;
//BYTE UART0TxEmpty = 1;
BYTE UART0_Tx_Buf[BUFSIZE]; //發送數據緩存區
DWORD UART0_Tx_Index=0; //當前發送數據的索引
BYTE UART0_Tx_flag=0; //數據包發送標識
DWORD UART0_Tx_Counter=0; //實際發送的數據包中的數據個數
BYTE UART0_Rx_Buf[BUFSIZE]; //接收數據緩存區
BOOL UART0_Rx_flag=FALSE; //數據包接收完成標識,當然是在采用數據包形式的數據傳輸時才使用
DWORD UART0_Rx_Counter=0; //接收數據緩沖區中的數據個數
//DWORD UART0Count = 0;
//========================================================================//
// 函數: void UART0Handler (void)
// 描述: UART0中斷服務程序
// 參數: 無
// 返回: 無
// 備注:
// 版本:
// 2008/01/05 First version
//========================================================================//
void UART0Handler (void) __irq
{
BYTE IIRValue, LSRValue;
BYTE Dummy;
DWORD i=0;
IENABLE; //中斷嵌套使能
IIRValue = U0IIR; //讀取UART0中斷標識
IIRValue &= 0x0e; //僅保留有效的中斷標識位
if ( IIRValue == IIR_RLS ) //接收線狀態 Receive Line Status
{
LSRValue = U0LSR; //讀取線狀態,同時會清零線狀態
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) //如果發生了任意一個錯誤則處理如下
{
Dummy = U0RBR; //讀數據接收緩沖寄存器會清除中斷標識
IDISABLE; //中斷嵌套禁止
VICVectAddr = 0; // Acknowledge Interrupt
return;
}
if ( LSRValue & LSR_RDR ) //接收數據OK Receive Data Ready
{
Dummy = U0RBR;
if(UART0_Rx_Counter>=BUFSIZE)
{
for(i=0;i<BUFSIZE-1;i++)
UART0_Rx_Buf[i] = UART0_Rx_Buf[i+1];
UART0_Rx_Buf[BUFSIZE-1] = Dummy;
}
else UART0_Rx_Buf[UART0_Rx_Counter++] = Dummy;
UART0_Rx_flag = TRUE;
}
}
else if ( IIRValue == IIR_RDA ) //接收數據可用 Receive Data Available
{
Dummy = U0RBR;
if(UART0_Rx_Counter>=BUFSIZE)
{
for(i=0;i<BUFSIZE-1;i++)
UART0_Rx_Buf[i] = UART0_Rx_Buf[i+1];
UART0_Rx_Buf[BUFSIZE-1] = Dummy;
}
else UART0_Rx_Buf[UART0_Rx_Counter++] = Dummy;
UART0_Rx_flag = TRUE;
}
else if ( IIRValue == IIR_CTI ) //數據包接收超時 Character timeout indicator
{ //實際上就是使能FIFO時,在接收的隊列當中的有效數據>=1時,在3.5~4.5個字符周期
//之內沒有發生FIFO的動作,則產生該中斷
Dummy = U0RBR; //讀數據以清中斷
}
else if ( IIRValue == IIR_THRE )//發送移位寄存器空,即上一次發送完成并準備好了下一次發送 THRE, transmit holding register empty
{
LSRValue = U0LSR; //檢查狀態寄存器,看是否在U0THR當中有有效數據存在
if ( LSRValue & LSR_THRE )
{ //可以發送
if(UART0_Tx_Index<UART0_Tx_Counter)
{
U0THR = UART0_Tx_Buf[UART0_Tx_Index++];
// U1IER &= ~0x02;//
}
else
{
UART0_Tx_flag = 0; //當前發送狀態標識清零
}
}
}
IDISABLE;
VICVectAddr = 0; // Acknowledge Interrupt
}
//========================================================================//
// 函數: void UART0Init(DWORD baudrate)
// 描述: UART0初始化函數
// 參數: baudrate 要設置的波特率
// 返回: 無
// 備注:
// 版本:
// 2008/01/05 First version
//========================================================================//
void UART0Init(DWORD baudrate)
{
DWORD Fdiv;
PINSEL0 &= ~0x0000000f; //Enable RX0 TX0 port of UART0
PINSEL0 |= 0x00000005;
U0LCR = 0x83; //設置8位數據模式,一個停止位,無奇偶校驗
Fdiv = ( Fpclk / 16 ) / baudrate ;
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
install_irq( UART0_INT, (void *)UART0Handler );
U0LCR &= ~0x80;
// U0FCR |= 0x01;
// U0FCR |= 0x40;
U0IER = 0x07; //打開UART0的中斷
}
//========================================================================//
// 函數: void UART0Send(BYTE *BufferPtr, DWORD Length )
// 描述: UART0數據包發送函數
// 參數: BufferPtr 要發送的數據的首地址
// Length 要發送的數據的個數
// 返回: 無
// 備注:
// 版本:
// 2008/01/05 First version
//========================================================================//
void UART0Send(BYTE *BufferPtr, DWORD Length )
{
while(UART0_Tx_flag); //等待發送完畢
if(Length<=BUFSIZE)
{
//裝載數據包的數據至發送緩沖區
for(UART0_Tx_Counter=0;UART0_Tx_Counter< Length;UART0_Tx_Counter++)
UART0_Tx_Buf[UART0_Tx_Counter] = *BufferPtr++;
UART0_Tx_Index = 0; //索引清零
UART0_Tx_flag = 1; //發送標識置1
U0THR = UART0_Tx_Buf[UART0_Tx_Index++];
}
else return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -