본문 바로가기
코스웨어/14년 스마트컨트롤러

2014.7.9 출석번호3번 김대희 업무일지

by 알 수 없는 사용자 2014. 7. 9.
728x90
반응형
void DBGU_init()
{
  // (1 << 9) | (1 << 10) 와 같은 효과이다.
   // A기능을 사용한다.
  *AT91C_DBGU_CR =   AT91C_US_RSTRX | AT91C_US_RSTTX;
  
  *AT91C_PIOA_ASR =   AT91C_PA9_DRXD | AT91C_PA10_DTXD;
  
  *AT91C_PMC_PCER =   (1<<AT91C_ID_SYS);

  *AT91C_DBGU_IDR =   0xFFFFFFFF;  // Interrupt Disable Register

  *AT91C_DBGU_BRGR =   CAL_CD;  // Baud rate REG


  *AT91C_DBGU_MR =   AT91C_US_PAR_EVEN | AT91C_US_CHMODE_NORMAL;  // 짝수 페리티,NOMAL MODE
  *AT91C_DBGU_CR =   AT91C_US_RXEN | AT91C_US_TXEN;  // 송수신 둘다 설정
  

}


페리티를 짝수로 설정하고 NOMAL MODE로 맞추어 놨음

AT91C_DBGU_MR 레지스터의 셋팅이 끝났으며


DBGU_SR 레지스터를 이용해 송수신의 상태를 알아본다.



unsigned char DBGU_Rx(void)
{
  while(0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY)); 
  return *AT91C_DBGU_RHR;
}

void DBGU_Tx(unsigned char cData)
{
  while(0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY));
  *AT91C_DBGU_THR = cData;
}


헤더파일에 define되어 있는 SR레지스터의 이름은 ' AT91C_DBGU_CSR '이다.


#define AT91C_US_RXRDY        (0x1 <<  0// (DBGU) RXRDY Interrupt
#define AT91C_US_TXRDY        (0x1 <<  1// (DBGU) TXRDY Interrupt


보다시피 각각의 비트는 위와같이 define되어 있다.

다시 위의 소스코드로 돌아가


Rx함수부터 살펴보면

DBGU_SR의 define된 이름은 AT91C_DBGU_CSR 이다.

이 레지스터의 RXRDY가 '0'이라면 무한 while문이 돈다

그리고 RXRDY의 상태가 '1'이된다면 AT91C_DBGU_RHR에 있는 데이터가 return될 것이다.


Tx함수를 살펴보면

Rx함수와 마찬가지로 TXRDY비트에 '1'이 들어간다면 AT91C_DBGU_THR 에 원하는 데이터가 들어갈 것이다.




void DBGU_Str(unsigned char *cString)
{
  while(0 != *cString)
  {
    DBGU_Tx(*cString);
    ++cString;
  }
}


위 함수까지 작성했다면 UART통신할 준비가 다 된 것이다.

이제 ' DBGU_Str' 함수를 이용해 원하는 문자데이터를 하이퍼 터미널에 띄울 수 있게 된다.



  • main()
int main() 
{
  volatile unsigned int uiCnt = 0;

  LCD_Init();
  DBGU_init();
  DELAY(60000);

  LCD_Str("TEST");
  DBGU_Str("TEST");

  while(1)
  {
  }

}




728x90