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

📄 uart.c

📁 PROTEUS下仿真ARM应用系统
💻 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 + -