?? uart.c
字號(hào):
#include "config.h"
#include "uart.h"
#include "libvic.h"
#include "harder.h"
#include "Includes.h"
#include "COMMRTOS.h"
typedef unsigned char uchar;
typedef unsigned int uint;
static volatile uchar *UART_BASE_ADDR[]={0,UART0_BASE,UART1_BASE};
extern void IRQASMUart0(void);
extern void IRQASMUart1(void);
static void CommISR(int CommNum);
void IRQCUart0(void)
{
CommISR(COMM1);
VICVectAddr =0;
}
void IRQCUart1(void)
{
CommISR(COMM2);
VICVectAddr = 0;
}
//----------------------------------------------------------
static void CommISR(int CommNum)
{
int i;
uchar c;
uchar err;
volatile uchar *BaseAddr;
BaseAddr=UART_BASE_ADDR[CommNum];
while(1) //接收中斷和發(fā)送中斷可能同時(shí)發(fā)生
{
switch( *(BaseAddr+IIR) & 0x07 )
{
case 0x01: //沒有中斷返回
return;
case 0x04: //接收中斷
for(i=0;i<16;i++)
{
if( (*(BaseAddr+LSR) & 0x01)==0 )//FIFO中的數(shù)據(jù)讀完
break;
CommPutRxChar(CommNum,*(BaseAddr+RBR));
}
break;
case 0x02: //發(fā)送中斷
for(i=0;i<16;i++)
{
c=CommGetTxChar(CommNum,&err);
if(err==COMM_NO_ERR)
{
*(BaseAddr+THR ) = c;
}
else //發(fā)送緩沖區(qū)空即最后一個(gè)字節(jié)發(fā)送完畢產(chǎn)生的中斷
{
CommSendIdle(CommNum);
break;
}
}
break;
}
}
}
void StartSent(uchar ch)
{
uchar oserr;
volatile uchar *BaseAddr;
BaseAddr=UART_BASE_ADDR[ch];
*(BaseAddr+THR ) = CommGetTxChar(ch,&oserr);
}
void ComInit(uchar CommNum,int Baudrate)
{
uchar err;
volatile uchar *BaseAddr;
BaseAddr=UART_BASE_ADDR[CommNum];
CommInit(CommNum,&err);
if(CommNum==COMM1)
{
SetPinMode(0,1,0);
SetPinMode(1,1,0);
}
else
{
SetPinMode(8,1,0);
SetPinMode(9,1,0);
}
*(BaseAddr+LCR) = 0x83;
*(BaseAddr+DLL) = Fpclk/16/Baudrate%256;
*(BaseAddr+DLM) = Fpclk/16/Baudrate/256;
*(BaseAddr+LCR) = StopBitNum1|DataBitNum8;
*(BaseAddr+FCR) = RxTriLevel08;
*(BaseAddr+IER) = RxIntEn | TxIntEn;
if(CommNum==COMM1)
{
IRQOpen(IRQ_UART0,IRQ_UART0,(int)IRQASMUart0);
}
else
{
IRQOpen(IRQ_UART1,IRQ_UART1,(int)IRQASMUart1);
}
}
void ComSendBuff(int CommNum,uchar *TxBuff,int Len)
{
while(Len--)
CommPutChar(CommNum,*TxBuff++,0);
}
void ComPutChar(int CommNum,char c)
{
CommPutChar(CommNum, c,0);
}
void CommSendString(int CommNum,char *Str)
{
while(*Str)
{
CommPutChar(CommNum,*Str++,0);
}
}
uchar ComGetChar(int CommNum)
{
uchar err;
return(CommGetChar(CommNum,0,&err));
}
uint ComGetBuff(int CommNum,uint Timeout,uchar *RxBuff,int Len)
{
uint i=0;
uchar c;
uchar err;
while(Len--)
{
c = CommGetChar(CommNum,Timeout,&err);
if( err==COMM_NO_ERR )
{
*RxBuff++=c;
i++;
}
else
{
break;
}
}
return(i);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -