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

📄 interrupt_usart.c

📁 在UCOS-II操作系统成功移植到AT91SAM7S64的基础上
💻 C
字号:
//* File Name           : interrupt_Usart.c

#include<string.h>
#include<stdlib.h>

#include "Board.h"
#include "interrupt_Usart.h"
#include "ST16C2550.h"
#include "os_cpu.h"


#define USART0_INTERRUPT_LEVEL		1
#define USART1_INTERRUPT_LEVEL		3

#define USART_BAUD_RATE0 		115200
#define USART_BAUD_RATE1 		9600

extern AT91PS_USART COM0 ;
extern AT91PS_USART COM1;

extern struct _AT91S_CDC 	pCDC;

unsigned char buff_tx;
unsigned int first =0;

extern unsigned char ReceiverStr1[100];
extern unsigned char ReceiverStr2[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 char measure_data[200];

extern struct {
  float time;
  double latitude;
  double longitude;
  int GPSquality;
  int GPSNum;
  double GPSprecision;
  double GPSHight;
}GPSData;

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初始化
 * 参数:无
 * 返回值:无

 * 初始化 UART0
 * 115200,n,8,1
 * 数据准备就绪中断
 * 发送中断
*******************************************************************************/
void InitUSART0(void)
{ 
    // 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;
    AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
    AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_US0, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart0_c_irq_handler);
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
}


/***************************************
 *初始化 UART1
 *9600,n,8,1
 *数据准备就绪中断
***************************************/
void InitUSART1(void)
{
    // Configure PIO controllers to periph mode
    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,
 		       (unsigned int)AT91C_PA21_RXD1 | (unsigned int)AT91C_PA22_TXD1, 
 		       0);
    // 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);
    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_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
}

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

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

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

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

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

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

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

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

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

/*******************************************************************************
 * 说明:Usart1_c_irq_handler函数,中断句柄
 * 参数:无
 * 返回值:无
 * 连接GPS
 * 9600,n,8,1
*******************************************************************************/
void Usart1_c_irq_handler(void)
{
#if OS_CRITICAL_METHOD == 3                  
    OS_CPU_SR  cpu_sr = 0;
#endif
    
    OS_ENTER_CRITICAL(); 
    AT91C_BASE_AIC->AIC_ICCR  = AT91C_ID_US1; // 清除中断
    AT91C_BASE_AIC->AIC_EOICR = 0;            // 中断结束信号
    OS_EXIT_CRITICAL();

    int i = 0;
    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;
                }
                Pos0 = 0;
            } else {
                Pos0++;
            }
        }
    }
}

/*******************************************************************************
 * 说明:Usart0_c_irq_handler函数,中断句柄
 * 参数:无
 * 返回值:无
*******************************************************************************/
void Usart0_c_irq_handler(void)
{
#if OS_CRITICAL_METHOD == 3                    
    OS_CPU_SR  cpu_sr = 0;
#endif
    
    OS_ENTER_CRITICAL();
    AT91C_BASE_AIC->AIC_ICCR  = AT91C_ID_US0; // 清除 中断
    AT91C_BASE_AIC->AIC_EOICR = 0;            // 中断结束信号
    OS_EXIT_CRITICAL(); 

    flagstatus0 = COM0->US_CSR;
    if((COM0->US_CSR&AT91C_US_RXRDY)==1) {
        receivebyte0=AT91F_US_GetChar(AT91C_BASE_US0);
        AT91F_US_PutChar(AT91C_BASE_US0,receivebyte0);
    }
}


         /* int i;
          unsigned char ctl_strTemp[10]; 
          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 + -