📄 uart.c.bak
字号:
#include "config.h"
#include "uart.h"
#include "COMMRTOS.h"
typedef unsigned char uchar;
typedef unsigned int uint;
void CommISR(int CommNum);
void __irq Comm1ISR(void)
{
CommISR(COMM1);
VICVectAddr =0;
}
void __irq Comm2ISR(void)
{
CommISR(COMM2);
VICVectAddr = 0;
}
void CommInit(int CommNum,int Baudrate)
{
volatile uchar *BaseAddr;
if(CommNum==COMM1)
{
BaseAddr=UART0_BASE;
}
else if(CommNum==COMM2)
{
BaseAddr=UART1_BASE;
}
else
return;
CommInit(CommNum);
*(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)Comm1ISR);
}
else
{
IRQOpen(IRQ_UART1,IRQ_UART1,(int)Comm2ISR);
}
}
//----------------------------------------------------------
void CommISR(int CommNum)
{
int i;
uchar c;
uchar err;
uchar *BaseAddr;
if(CommNum==COMM1)
BaseAddr=UART0_BASE;
else if(CommNum==COMM2)
BaseAddr=UART1_BASE;
else
return;
while(1) //接收中断和发送中断可能同时发生
{
switch( *(BaseAddr+IIR) & 0x07 )
{
case 0x01: //没有中断返回
return;
case 0x04: //接收中断
for(i=0;i<16;i++)
{
if( (*(BaseAddr+LSR) & 0x01)==0 )//FIFO中的数据读完
break;
CommPutRxChar(CommNum,*(BaseAddr+RBR));
}
break;
case 0x02: //发送中断
for(i=0;i<16;i++)
{
c=CommGetTxChar(CommNum,&err)
if(err==COMM_NO_ERR)
{
*(BaseAddr+THR ) = c;
}
else
{
break;
}
}
break;
}
}
}
void CommSendData(int CommNum,uchar *TxBuff,int Len)
{
uchar sbuf;
volatile uchar *BaseAddr;
if(CommNum==COMM1)
BaseAddr=UART0_BASE;
else if(CommNum==COMM2)
BaseAddr=UART1_BASE;
else
return;
while(Len--)
CommPutChar(CommNum,*TxBuff++,0);
}
void StartSent(uchar ch,uchar c)
{
uchar oserr;
volatile uchar *BaseAddr;
if(CommNum==COMM1)
BaseAddr=UART0_BASE;
else if(CommNum==COMM2)
BaseAddr=UART1_BASE;
else
return;
CommGetTxChar(ch,&oserr);
*(BaseAddr+THR ) = c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -