📄 uartdriver.c
字号:
#include"config.h"
#include"uartdriver.h"
uint8 RevEN=0;
uint8 UTask,URev;
OS_EVENT *URevSem;
extern void UART0_Handler(void);
/****************************************************************************
* 名称:UART0()
* 功能:UART0中断服务函数
*入口参数:无
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void UART0(void)
{
VICVectAddr = 0;
if( 0x04==(U0IIR&0x0F))
{
if(RevEN!=0)
{
RevEN = 0;
OSSemPost(URevSem);
}
URev=U0RBR;
}
}
uint8 UARTInit(uint8 whichuart,UART_MODE mode)
{
uint8 i=0,*err;
uint32 Fdiv;
Fdiv=((Fpclk/16)/mode.bps);
if(0==mode.bps||mode.bps>115200)return 0;
if(0==mode.stp||mode.stp>2)return 0;
if(mode.datlen<5||mode.datlen>8)return 0;
i=(mode.datlen-5);
i|=((mode.stp-1)<<2);
if(mode.parity==0)i|=(1<3);
else if(mode.parity==1)i|=(3<3);
switch(whichuart)
{
case 0:
{
PINSEL0&=0xfffffff0;
PINSEL0|=0x00000005;
U0LCR=0x80;
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=i;
U0IER=7;
OSSemDel(URevSem,OS_DEL_ALWAYS||OS_DEL_NO_PEND,err);
URevSem=OSSemCreate(0);
VICIntSelect=0x00000000; //设置所有通道为IRQ中断
VICVectCntl6=0x26; //UART0中断通道分配到IRQ Slot0,即优先级最高
VICVectAddr6=(int)UART0_Handler; //设置UART0向量地址
VICIntEnable|=0x00000040; //使能UART0中断
return UART_INIT_OK;
}break;
case 1:
{
PINSEL0&=0xfff0ffff;
PINSEL0|=0x00050000;
U1FCR = 0x00;
U1LCR=0x83;
U1DLM=Fdiv/256;
U1DLL=Fdiv%256;
U1LCR=0x03;
return UART_INIT_OK;
}break;
default:return UART_NUM_ERR;
break;
}
}
uint8 UARTSendByte(uint8 whichuart,uint8 data)
{
switch(whichuart)
{
case 0:
{
if((U0LSR&0x20)!=0)
{
U0THR=data;
// while((U0LSR&0x20)==0);
return UART_SENDBYTE_OK;
}
else return UART_SENDBYTE_ERR;
}break;
case 1:
{
if((U1LSR&0x20)!=0)
{
U1THR=data;
while((U1LSR&0x20)==0);
return UART_SENDBYTE_OK;
}
else return UART_SENDBYTE_ERR;
}break;
default:return UART_NUM_ERR;
}
}
char UARTRevByte(uint8 whichuart)
{
switch(whichuart)
{
case 0:
{
RevEN=U0RBR;
RevEN=1;
OSSemPend(URevSem,0,(void*)0);
return(URev);
}break;
case 1:
{
RevEN=1;
OSSemPend(URevSem,0,(void*)0);
return(URev);
}break;
default:return UART_REVBYTE_ERR;
break;
}
}
uint8 UARTSendStr(uint8 whichuart,uint8 *str)
{
if(whichuart<2)
{
while(*str)
{
UARTSendByte(whichuart,*str++);
}
return UART_SENDSTR_OK;
}
else return UART_NUM_ERR;
}
uint8 UARTRevStr(uint8 whichuart,uint8 *str)
{
if(whichuart<2)
{
while(1)
{
*str=UARTRevByte(whichuart);
UARTSendByte(whichuart,*str);
if(*str=='\r')
{
*str='\0';
break;
}
else str++;
} return UART_REVSTR_OK;
}
else return UART_NUM_ERR;
}
void UARTPrintf(uint8 whichuart, char *fmt,...)
{
va_list ap;
static char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
UARTSendStr(whichuart, string);
va_end(ap);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -