⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartdriver.c

📁 一个arm7实例
💻 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 + -