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

📄 interrupt_usart.c

📁 ucos 在ARM7下的移植代码
💻 C
字号:
//* File Name           : interrupt_Usart.c

#include "bsp.h"
#include "interrupt_Usart.h"
#include "ST16C2550.h"
//#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define USART0_INTERRUPT_LEVEL		1
#define USART1_INTERRUPT_LEVEL		2

#define USART_BAUD_RATE0 		115200
#define USART_BAUD_RATE1 		9600
void InitUSART1(void);

extern AT91PS_USART COM0 ;
extern AT91PS_USART COM1;;
//AT91PS_USART  u_pUSART0 = AT91C_BASE_US0;
//AT91PS_USART  u_pUSART1 = AT91C_BASE_US1;

//unsigned char receivebyte;

extern struct _AT91S_CDC 	pCDC;
//unsigned char buff_tx[0xff];
//unsigned char *pbuff_tx=buff_tx;
unsigned char buff_tx;
unsigned int first =0;

extern unsigned char ReceiverStr1[100];

extern unsigned char IsStartCommand;
unsigned char flagstatus0;
unsigned char status0;
unsigned char receivebyte0;
unsigned char flagstatus1;
unsigned char status1;
unsigned char receivebyte1;


int Pos0=0;
int Datahead=0;
unsigned char GPSstrTemp[20];
extern struct {
  float time;
  double latitude;
  double longitude;
  int GPSquality;
  int GPSNum;
  double GPSprecision;
  double GPSHight;
}GPSData;
extern char measure_data[200];
/*extern float compass;
extern float pitch;
extern float roll;
extern float V;
*/
extern int send_pos;
extern unsigned char receiverdata_portA;
extern unsigned char receiverdata_portB;
extern unsigned char receiver_porta_state;
extern unsigned char receiver_portb_state;
extern void mDelay1_2uS( );
extern void GetValue_chanel5();
extern int measure_data_flag;

extern int Isctlhead;
extern unsigned char Receiver_CTL[15];
extern int ctl_Pos;
unsigned int ctl_checksum;
unsigned int temp_checksum;
extern char PowerState;

extern int Light;
/*******************************************************************************
 * 说明:Usart_init函数,UART0初始化
 * 参数:无
 * 返回值:无

 *初始化 UART1
 *115200,n,8,1
 *数据准备就绪中断
 *发送中断

*******************************************************************************/
void InitUSART0(void)
{ // 初始化 UART0

	//AT91PS_USART COM0 = AT91C_BASE_US0;

 	//* Configure PIO controllers to periph mode
 	AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
 		((unsigned int) AT91C_PA5_RXD0    ) |
 		((unsigned int) AT91C_PA6_TXD0    ) ,
 		0); // Peripheral B


   	// First, enable the clock of the PIOB
    	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
	// Usart Configure
      AT91F_US_Configure (COM0, MCK, AT91C_US_ASYNC_MODE, USART_BAUD_RATE0, 0);

	// Enable usart
	COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

    //* Enable USART IT error and RXRDY
    	//AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE | AT91C_US_RXRDY);
        
        AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
        //AT91F_US_EnableIt(COM0,AT91C_US_RXRDY|AT91C_US_TXRDY);
    	//* open Usart 1 interrupt
        AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart0_c_irq_handler);
	//AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL, Usart_c_irq_handler);
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
}

void write_char_USART0(unsigned char ch)
{  // 向UART0写入字符数据
  while (!(COM0->US_CSR&AT91C_US_TXRDY)==1);
  COM0->US_THR = ((ch & 0xFF));//0x1ff
}

unsigned char read_char_USART0(void) {      // 从UART0读取字符数据
  while (!(COM0->US_CSR&AT91C_US_RXRDY)==1);
  return((COM0->US_RHR) & 0x1FF);
}

unsigned char read_char_USART0_nonstop(void) {  // 从UART0读取字符数据,无停止位
  if((COM0->US_CSR&AT91C_US_RXRDY)==1)
    return((COM0->US_RHR) & 0x1FF);
  else return 0;
}

void write_str_USART0(unsigned char* buff) {  // 向UART0写入字符串数据
  unsigned int i = 0x0;
  while(buff[i] != '\0') {
    write_char_USART0(buff[i]);
    i++;
  }
}

/***************************************
 *初始化 UART1
 *9600,n,8,1
 *数据准备就绪中断
***************************************/
void InitUSART1(void)
{ 


	//AT91PS_USART COM1 = AT91C_BASE_US1;

 	//* Configure PIO controllers to periph mode
 	AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
 		((unsigned int) AT91C_PA21_RXD1    ) |
 		((unsigned int) AT91C_PA22_TXD1    ) 
                 , // Peripheral A
 		0); // Peripheral B


   	// First, enable the clock of the PIOB
    	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US1 ) ;
	// Usart Configure
      AT91F_US_Configure (COM1, MCK, AT91C_US_ASYNC_MODE, USART_BAUD_RATE1, 0);


	// Enable usart
	//COM1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
        COM1->US_CR =  AT91C_US_RXEN;
    //* Enable USART IT error and RXRDY
    	//AT91F_US_EnableIt(COM1,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY|AT91C_US_TXRDY);
        AT91F_US_EnableIt(COM1,AT91C_US_RXRDY);
    	//* open Usart 1 interrupt
        AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US1, USART1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart1_c_irq_handler);
	//AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL, Usart_c_irq_handler);
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);

	


}

void write_char_USART1(unsigned char ch)
{  // 向UART1写入字符数据
  while (!(COM1->US_CSR&AT91C_US_TXRDY)==1);
 COM1->US_THR = ((ch & 0xFF));//0x1ff
}

unsigned char read_char_USART1(void) 
{      // 从UART1读取字符数据
  while (!(COM1->US_CSR&AT91C_US_RXRDY)==1);
  return((COM1->US_RHR) & 0x1FF);
}

unsigned char read_char_USART1_nonstop(void) {  // 从UART1读取字符数据,无停止位
  if((COM1->US_CSR&AT91C_US_RXRDY)==1)
    return((COM1->US_RHR) & 0x1FF);
  else return 0;
}

void write_str_USART1(unsigned char* buff) {  // 向UART1写入字符串数据
  unsigned int i = 0x0;
  while(buff[i] != '\0') {
    write_char_USART1(buff[i]);
    i++;
  }
}
void write_nchar_USART1(unsigned char* buff,int n) 
{  // 向UART1写入字符串数据
  unsigned int i = 0x0;
  for(i=0;i<n;i++)
  {
      write_char_USART1(buff[i]);
      
  }
}




/*******************************************************************************
 * 说明:Usart_c_irq_handler函数,中断句柄
 * 参数:无
 * 返回值:无
 *连接GPS
 *9600,n,8,1
*******************************************************************************/

void Usart1_c_irq_handler(void)
{
  int i;
  //AT91PS_USART USART_pt = AT91C_BASE_US0;
  //* get Usart status register
  flagstatus1 =COM1->US_CSR;
  if((COM1->US_CSR&AT91C_US_RXRDY)==1)
  {
    receivebyte1=AT91F_US_GetChar(AT91C_BASE_US1);
    if(receivebyte1=='$') Datahead=1;
    if(Datahead==1)
    {
       ReceiverStr1[Pos0]=receivebyte1;
       if(Pos0>=99 ||receivebyte1=='*')
       {
          ReceiverStr1[Pos0]=0;
          Datahead=0;
          
          for(i=0;i<6;++i)
          {
            GPSstrTemp[i]=ReceiverStr1[i];
          }
          GPSstrTemp[6]=0;
         
          if(strcmp((char const *)GPSstrTemp,"$GPGGA")==0)
          {
             strcpy(measure_data,(char *)ReceiverStr1);
             measure_data_flag=1;
             
             
           
          }//if(strcmp((char const *)strTemp,"$GPGGA")==0)
          Pos0=0;
       }//if(Pos0>=100 ||receivebyte==0x0A )
       else
       {
          ++Pos0;
        }
    }// if(Datahead==1)


  }//  if((COM1->US_CSR&AT91C_US_RXRDY)==1)

}



/*******************************************************************************
 * 说明:Usart0_c_irq_handler函数,中断句柄
 * 参数:无
 * 返回值:无
 *连接GPS
 *115200,n,8,1
 *和串口服务器连接
*******************************************************************************/

void Usart0_c_irq_handler(void)
{
    int i;
    unsigned char ctl_strTemp[10];
    flagstatus0 = COM0->US_CSR;
    if((COM0->US_CSR&AT91C_US_RXRDY)==1)
    {
          receivebyte0=AT91F_US_GetChar(AT91C_BASE_US0);
          if(receivebyte0=='$') Isctlhead=1;
          if(Isctlhead==1)
          {
             Receiver_CTL[ctl_Pos]=receivebyte0;
             if(ctl_Pos>=13 ||receivebyte0==0x0A )
             {
          
                Isctlhead=0;
          
                for(i=0;i<4;++i)
                {
                   ctl_strTemp[i]=Receiver_CTL[i];
                }
                ctl_strTemp[4]=0;
         
               if(strcmp((char const *)ctl_strTemp,"$CTL")==0)
               {
                  if(receivebyte0==0x0A)
                  {   
                      ctl_checksum=0;
                      for(i=0;i<9;++i)
                      {
                         ctl_checksum^=Receiver_CTL[i];
                      }
                      temp_checksum=16*((int)(Receiver_CTL[9]-48))+(int)(Receiver_CTL[10]-48);
                      if(ctl_checksum==temp_checksum)//电源关
                      {
                        if(Receiver_CTL[7]=='1')
                        {
                                 
                          if(Receiver_CTL[5]=='1') 
                          {
                            *AT91C_PIOA_SODR|=(powerswithTV1);
                            PowerState |=0x01;
                          }
                          else if(Receiver_CTL[5]=='2')
                          {
                            *AT91C_PIOA_SODR|=(powerswithTV2);
                            PowerState |=0x02;
                          }
                          else if(Receiver_CTL[5]=='3')
                          {
                            *AT91C_PIOA_SODR|=(powerswithCommunication1);
                             PowerState |=0x04;
                          }
                          else if(Receiver_CTL[5]=='4')
                          {
                            *AT91C_PIOA_SODR|=(powerswithCommunication2);
                            PowerState |=0x08;
                          }
                                   
                        }
                        else
                        {
                            if(Receiver_CTL[7]=='0')//电源开
                            {
                                 
                                if(Receiver_CTL[5]=='1')
                                {
                                  *AT91C_PIOA_CODR|=(powerswithTV1); 
                                  PowerState &=0xFE;
                                }
                                else if(Receiver_CTL[5]=='2')
                                {
                                  *AT91C_PIOA_CODR|=(powerswithTV2);
                                  PowerState &=0xFD;
                                }
                                else if(Receiver_CTL[5]=='3')
                                {
                                  *AT91C_PIOA_CODR|=(powerswithCommunication1);
                                  PowerState &=0xFB;
                                }
                                else if(Receiver_CTL[5]=='4')
                                {
                                  *AT91C_PIOA_CODR|=(powerswithCommunication2);
                                  PowerState &=0xF7;
                                }
                                   
                            }
                                     
                          
                         }
                        
                        
                       }// if(ctl_checksum==temp_checksum)
 
                    
                  }//if(receiverdata==0x0A)
               }//if(strcmp((char const *)strTemp,"$CTL")==0)
               ctl_Pos=0;
             }// if(ctl_Pos>=10 ||receiverdata==0x0A )
             else
            {
               ++ctl_Pos;
            }   
          }//if(Datahead==1)      
      
    }//接收中断
 /*   if((COM0->US_CSR&AT91C_US_TXRDY)==2)
    {
           send_pos++;
           if(measure_data[send_pos]!=0x0)
           {
            // COM0->US_THR = ((measure_data[send_pos] & 0xFF));
             write_char_USART0(measure_data[send_pos]);
           }
           else
           {
             send_pos=0;
             if(Light==1)
             {
                *AT91C_PIOA_SODR|=LED1;                      //light LED1
                Light=0;
             }
             else
             {
                *AT91C_PIOA_CODR|=LED1;                      //light LED1
                Light=1;
             }             
           }
      
 
    } 
*/
}

⌨️ 快捷键说明

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