📄 uart.c
字号:
#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) //接收中断和发送中断可能同时发生
{
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 //发送缓冲区空即最后一个字节发送完毕产生的中断
{
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -