Busan IT/ARM Controller2015. 8. 14. 17:06

==================================Outline====================================

ARM UART Interrupt 

----------------------------------------------------------------------------

 

수신 인터럽트를 만들어서 데이터 통신을 해보자.

 

 

구현하고자하는 내용은 키보드에 ‘m' 또는 ’M'을 입력하였을 때 ARM에서 메뉴를 표시하게 하고 그 이 외의 값을 입력했을 때는 잘못 입력되었음을 출력하는 것이다.

 

기존에 있던 DBGU_Init 함수를 복사하여 DBGU_Init_ISR을 만들고 난 후 DBGU_Init_Polling으로 이름을 바꾼 후 코딩을 하자.

 

DBGU_Init_ISR에서 인터럽트를 사용하기 위한 코드를 추가해야 한다.

송수신을 활성화 시키는 코드를 가장 밑으로 내리고 그 바로 위에 코딩을 해보자.

 

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

} 


interrupt 핸들러에 등록되어 있는 함수를 만들자. 간단하게 메뉴를 띄우는 함수이다.


void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;          
  }
  
  
  
  //RX TX Enable
}




/*** 전체 소스 코드 ***/


#include <project.h>


unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}

void DBGU_Init_Polling()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}
void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;          
  }
  
  
  
  //RX TX Enable
}

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

}


void DBGU_STR(const char * cpStr)
{
  while0 != *cpStr)
  {
    DBGU_TX(*cpStr);
    ++cpStr;
  }
}

void DBGU_Init()
{
  DBGU_Init_ISR();
}


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

주파수와 ARM 메모리맵  (0) 2015.08.28
Interrupt Code, 초음파 센서 SRF05, Timer/Counter  (0) 2015.08.19
ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
Posted by newind2000