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

📄 uart.c

📁 移植Nuclues_RTC到coldfire5307在diab下编译通过
💻 C
字号:
/* 
 * Purpose:		Initialize ColdFire 5307
 *
 */

#define IMMaddr	0x10000000
#define SDRAMaddr 0x00000000
#define SDRAMsize 0x00800000		//8M
#define SRAMaddr 0x00800000
#define SRAMsize (4 * 1024)		//4K
#define EXT_SRAMaddr 0xFE400000	
#define EXT_SRAMsize (128 * 1024)	//128K
#define NULL  0x00
#include "mcf5307.h" 
#include "uart.h"
#include  "nucleus.h"

//Global Pointer
extern MCF5307_IMM *imm;

extern NU_SEMAPHORE    Semaphore_0;
extern NU_SEMAPHORE    Semaphore_1;
extern NU_SEMAPHORE    Semaphore_3;



void Uart1_ReInit( MCF5307_IMM *imm)
{
	
	imm->uart1.UCR1=0x10;    /*to reset the Mode Register Pointer*/
	imm->uart1.UCR1=0x20;    /*to reset the Receiver*/
	imm->uart1.UCR1=0x30;    /*to reset the Transimitter*/
	imm->uart1.UCR1=0x40;    /*to reset the Error Stauts*/
	imm->uart1.UCR1=0x50;    /*to reset the Break Change Interrupt*/
	
	imm->uart1.UMR11_UMR21=0x13;   //no Parity , 8bits
	imm->uart1.UMR11_UMR21=0x07;   //mode Normal,one stop bit
	
	imm->uart1.USR1_UCSR1=0xdd;  //use Timer as Clock
	
	imm->uart1.UISR1_UIMR1=0x00;  //Disenable Interrupt
	
	imm->uart1.UBG11=0x00;
	imm->uart1.UBG21=0x92;        //bus Freq=45MHz,9600 bps
	
	imm->uart1.UCR1=0x10;    /*to reset the Mode Register Pointer*/
	imm->uart1.UCR1=0x20;    /*to reset the Receiver*/
	imm->uart1.UCR1=0x30;    /*to reset the Transimitter*/
	imm->uart1.UCR1=0x05;    /*to Enable Receiver & Transmitter*/
	
	imm->uart1.UISR1_UIMR1=0x02;  //Enable Interrupt 
	 
	imm->sim.ICR4=0x84;           //enable auto vect. ,level 1  ,to vect offset 0x64
	
	Uart1_TxCompleted=0x00;
	Uart1_RxCompleted=0x00;
	UartBusy=0x00;       
	
}


//extern "C"
void Interrupt_UART1()
{
     unsigned char Status;
     unsigned char DataReceived;
     unsigned char DataTransmit;
     
     Status=imm->uart1.UISR1_UIMR1;
     
     
     //receive subrouting
     while( ( (Status&0x02)==0x02)&&(Uart1_RxReceivedLength!=Uart1_RxRequestLength)&&(Uart1_RxEnable==0xff) )           
     {
      DataReceived=imm->uart1.URB1_UTB1;
      *Uart1_RxPointer=DataReceived;
      Uart1_RxReceivedLength++;
      Uart1_RxPointer++;
      Status=imm->uart1.UISR1_UIMR1;
      if( (Uart1_RxReceivedLength==Uart1_RxRequestLength)||(DataReceived==0x0d) )     //received 0x0d
         Uart1_RxCompleted=0xff;
     }
      
     //transmit subrouting 
     if( ((Status&0x01)==0x01)&&(Uart1_TxTransmitLength!=Uart1_TxRequestLength)&&(Uart1_TxEnable==0xff) )
     {
      DataTransmit=*Uart1_TxPointer;
      imm->uart1.URB1_UTB1=DataTransmit;
      Uart1_TxPointer++;
      Uart1_TxTransmitLength++;
      if(Uart1_TxTransmitLength==(Uart1_TxRequestLength))
         {
          Uart1_TxCompleted=0xff;
          imm->uart1.UISR1_UIMR1=0x02;      //no longer enable TxRdy interrupt 	
         }
     }
      
      
}

void Uart1_ReadyToReceive()
{
	Uart1_RxCompleted=0x00;
	Uart1_RxReceivedLength=0x00;
	imm->uart1.UCR1=0x20;    /*to reset the Receiver*/
	imm->uart1.UCR1=0x40;    /*to reset the Error Stauts*/
	imm->uart1.UCR1=0x50;    /*to reset the Break Change Interrupt*/
	imm->uart1.UCR1=0x05;    /*to Enable Receiver & Transmitter*/	
	
	Uart1_RxEnable=0xff;
//	Uart1_TxEnable=0x00;
		
}

void Uart1_ReadyToTransmit()
{
	Uart1_TxCompleted=0x00;
	Uart1_TxTransmitLength=0x00;
	imm->uart1.UCR1=0x30;         /*to reset the Transmit*/
	imm->uart1.UCR1=0x40;         /*to reset the Error Stauts*/
	imm->uart1.UCR1=0x50;         /*to reset the Break Change Interrupt*/
	imm->uart1.UCR1=0x05;         /*to Enable Receiver & Transmitter*/	
	imm->uart1.UISR1_UIMR1=0x03;  //enable TxRdy interrupt 	
	Uart1_TxEnable=0xff;         
	
}


void Uart1_ThreadWaittingForData()
{
	while(Uart1_RxCompleted!=0xff)
	{
	 asm("  nop  ");	
	 
	}
    /*Add Code to throw Message */
}

void Uart1_ThreadWaittingForSendCompleted()
{
    unsigned char Sta;	
    while( Uart1_TxCompleted!=0xff)      //wait for the last bytes to be transfer
    {
    asm("  nop  ");		
    } 
    
    Sta=imm->uart1.USR1_UCSR1;
    while( (Sta&0x08)==0x00 )           //TxEMP
    {
     Sta=imm->uart1.USR1_UCSR1;	       //wait for the last byte transfered ok!  
    }
    	   	   
}

void WaitLastByte(void)
{
 unsigned char Sta;
 Sta=imm->uart1.USR1_UCSR1;
 while( (Sta&0x08)==0x00 )           //TxEMP
    {
     Sta=imm->uart1.USR1_UCSR1;	       //wait for the last byte transfered ok!  
    }	
}




void PPrintf(char * Index)
{
 int i;
 for(i=0;Index[i]!=NULL;i++)
 {
  TxData[i]=Index[i];	
 }
 
 NU_Reset_Semaphore(&Semaphore_0,0);
 
 

 Uart1_TxPointer=TxData;
 Uart1_TxRequestLength=i;
 Uart1_ReadyToTransmit();
 NU_Obtain_Semaphore(&Semaphore_0,NU_SUSPEND);
 //WaitLastByte();
 
 Uart1_ThreadWaittingForSendCompleted();

 Uart1_TxCompleted=0x00;
 

}

void Printf(char * Index)             //Printf reentrancy!
{
  NU_Obtain_Semaphore(&Semaphore_1,NU_SUSPEND);	

 // NU_Reset_Semaphore(&Semaphore_1,0);

  while(UartBusy!=0x00)              //this code not very good!
  {
   NU_Sleep(20);
   NU_Sleep(20);
  }

  UartBusy=0xff;
  PPrintf(Index);
  UartBusy=0x00;
  
  NU_Release_Semaphore(&Semaphore_1);
	
}

unsigned long GetKey(void)
{
    NU_Reset_Semaphore(&Semaphore_3,0);		
    Uart1_RxPointer=RxData;
    Uart1_RxRequestLength=300;
    Uart1_ReadyToReceive();
    NU_Obtain_Semaphore(&Semaphore_3,NU_SUSPEND);
    Uart1_RxCompleted=0x00;   
    return Uart1_RxReceivedLength;    
}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -