시리얼 통신

 ECHO 예제
//---------- 디버그 유닛 관련 I/O 제어 레지스터

#define DBGU_CR   (*(volatile unsigned int *) 0xFFFFF200)  // DBGU Control Register
#define DBGU_MR   (*(volatile unsigned int *) 0xFFFFF204)  // DBGU Mode Register
#define DBGU_IER  (*(volatile unsigned int *) 0xFFFFF208)  // DBGU Interrupt Enable Register
#define DBGU_IDR  (*(volatile unsigned int *) 0xFFFFF20C)  // DBGU Interrupt Disalbe Register
#define DBGU_IMR  (*(volatile unsigned int *) 0xFFFFF210)  // DBGU Interrupt Disalbe Register
#define DBGU_SR   (*(volatile unsigned int *) 0xFFFFF214)  // DBGU Status Register
#define DBGU_RHR  (*(volatile unsigned int *) 0xFFFFF218)  // DBGU Receive Holding Register
#define DBGU_THR  (*(volatile unsigned int *) 0xFFFFF21C)  // DBGU Transmit Holding Register
#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220)  // DBGU Baud Rate Generator Register


//---------- 인터럽트 제어기 IO설정 

#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120)  // 인터럽트 허용 레지스터
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124)  // 인터럽트 금지 레지스터
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128)  // 인터럽트 클리어 레지스터
#define AIC_ISCR (*(volatile unsigned int *) 0xFFFFF12C)  // 인터럽트 세트 레지스터
#define AIC_SMR  ((volatile unsigned int *) 0xFFFFF000)    // AIC 소스 모드 레지스터
#define AIC_SVR  ((volatile unsigned int *) 0xFFFFF080)    // AIC 소스 벡터 레지스터


//---------- 입출력 IO설정 


#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460)  // PIO Pull-Up Disable Register
#define PIO_PUER (*(volatile unsigned int *) 0xFFFFF464)  // PIO Pull-Up Enable Register

#define PIO_IER  (*(volatile unsigned int *) 0xFFFFF440)  // PIO Interrupt Enable Register
#define PIO_IDR  (*(volatile unsigned int *) 0xFFFFF444)  // PIO Interrupt Disable Register
#define PIO_IMR  (*(volatile unsigned int *) 0xFFFFF448)  // PIO Interrupt Mask Register
#define PIO_ISR  (*(volatile unsigned int *) 0xFFFFF44C)  // PIO Interrupt Status Register

#define PIO_ASR  (*(volatile unsigned int *) 0xFFFFF470)  // PIO Peripheral A Select Register
#define PIO_BSR  (*(volatile unsigned int *) 0xFFFFF474)  // PIO Peripheral B Select Register

#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420)  // PIO Glitch Input Filter Enable Register
#define PIO_IFDR (*(volatile unsigned int *) 0xFFFFF424)  // PIO Glitch Input Filter Disable Register

#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력 
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER  (*(volatile unsigned int *) 0xFFFFF410) //출력 방향 설정
#define PIO_ODR  (*(volatile unsigned int *) 0xFFFFF414) //출력 방향 설정
#define PIO_PER  (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.
#define PIO_PDR  (*(volatile unsigned int *) 0xFFFFF404) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.


//---------- 전력 제어 설정

#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define PMC_PCDR (*(volatile unsigned int *) 0xFFFFFC14)

 
#define MASTERCLOCK 48000000
#define INTERR    0x00000100
#define LED      0x00000010 

//--------- 전역 변수

void Delayms(unsigned int ms) //딜레이 함수..

  volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;

  for(count = 0; count < countmax; count++);
}

void DBGU_write(char d)  // 송신 함수
{
  while(0 == (DBGU_SR & 0x0002));
  DBGU_THR = d;
}

unsigned char DBGU_read()  // 수신 함수
{
  while(0 == (DBGU_SR & 0x0001));
  return DBGU_RHR;
}

int main(void)
{
  unsigned char data;
  
  // PMC setting
  PMC_PCER = (unsigned int)1 << 2;    // PMC_PCER = (unsigned int)1 << 2;

  DBGU_CR = (1<<2)|(1<<3);      // 송수신부 리셋 및 금지
    
  // PIO setting
  PIO_PDR = (1<<9)|(1<<10);  // 병렬 포트 사용 금지
  PIO_ASR = (1<<9)|(1<<10);  // 장치 A 사용
  PIO_BSR = 0;        // 장치 B 사용 금지

  // DBGU setting
  DBGU_MR = (1<<11);      // Parity 사용하지 않음
  DBGU_BRGR = 313;      // Baud rate = 9600
  DBGU_CR = (1<<6)|(1<<4);  // tx, rx enable

  while(1)
  {
    data = DBGU_read();
    DBGU_write(data);
  }
  
  return 0;
// End Main....

// DBGU를 이용하여 간단한 시리얼 통신을 해보았다. PC 터미널에서 신호를 날리면 그 신호가 그대로 다시 돌아와서 PC 터미널에 찍히게 된다.

 // 정수형 데이터를 문자로 변환하여 전송하는 프로그램
//---------- 디버그 유닛 관련 I/O 제어 레지스터

#define DBGU_CR   (*(volatile unsigned int *) 0xFFFFF200)  // DBGU Control Register
#define DBGU_MR   (*(volatile unsigned int *) 0xFFFFF204)  // DBGU Mode Register
#define DBGU_IER  (*(volatile unsigned int *) 0xFFFFF208)  // DBGU Interrupt Enable Register
#define DBGU_IDR  (*(volatile unsigned int *) 0xFFFFF20C)  // DBGU Interrupt Disalbe Register
#define DBGU_IMR  (*(volatile unsigned int *) 0xFFFFF210)  // DBGU Interrupt Disalbe Register
#define DBGU_SR   (*(volatile unsigned int *) 0xFFFFF214)  // DBGU Status Register
#define DBGU_RHR  (*(volatile unsigned int *) 0xFFFFF218)  // DBGU Receive Holding Register
#define DBGU_THR  (*(volatile unsigned int *) 0xFFFFF21C)  // DBGU Transmit Holding Register
#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220)  // DBGU Baud Rate Generator Register


//---------- 인터럽트 제어기 IO설정 

#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120)  // 인터럽트 허 용 레지스터
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124)  // 인터럽트 금지 레지스터
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128)  // 인터럽트 클리어 레지스터
#define AIC_ISCR (*(volatile unsigned int *) 0xFFFFF12C)  // 인터럽트 세트 레지스터
#define AIC_SMR  ((volatile unsigned int *) 0xFFFFF000)    // AIC 소스 모드 레지스터
#define AIC_SVR  ((volatile unsigned int *) 0xFFFFF080)    // AIC 소 스 벡터 레지스터


//---------- 입출 력 IO설정 


#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460)  // PIO Pull-Up Disable Register
#define PIO_PUER (*(volatile unsigned int *) 0xFFFFF464)  // PIO Pull-Up Enable Register

#define PIO_IER  (*(volatile unsigned int *) 0xFFFFF440)  // PIO Interrupt Enable Register
#define PIO_IDR  (*(volatile unsigned int *) 0xFFFFF444)  // PIO Interrupt Disable Register
#define PIO_IMR  (*(volatile unsigned int *) 0xFFFFF448)  // PIO Interrupt Mask Register
#define PIO_ISR  (*(volatile unsigned int *) 0xFFFFF44C)  // PIO Interrupt Status Register

#define PIO_ASR  (*(volatile unsigned int *) 0xFFFFF470)  // PIO Peripheral A Select Register
#define PIO_BSR  (*(volatile unsigned int *) 0xFFFFF474)  // PIO Peripheral B Select Register

#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420)  // PIO Glitch Input Filter Enable Register
#define PIO_IFDR (*(volatile unsigned int *) 0xFFFFF424)  // PIO Glitch Input Filter Disable Register

#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력 
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER  (*(volatile unsigned int *) 0xFFFFF410) //출력 방향 설정
#define PIO_ODR  (*(volatile unsigned int *) 0xFFFFF414) //출력 방향 설정
#define PIO_PER  (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제 어 레지스터 병렬 입출력 포트로 사용한다.
#define PIO_PDR  (*(volatile unsigned int *) 0xFFFFF404) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.


//---------- 전력 제어 설정

#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define PMC_PCDR (*(volatile unsigned int *) 0xFFFFFC14)

 
#define MASTERCLOCK 48000000
#define INTERR    0x00000100
#define LED      0x00000010 

//--------- 전역 변수

void Delayms(unsigned int ms) //딜레이 함 수..

  volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;

  for(count = 0; count < countmax; count++);
}

void DBGU_write(char *d)    // 문자열 송신 함수
{
  while(0 != *d)
  {
    while(0 == (DBGU_SR & 0x0002));
    DBGU_THR = *d;
    ++d;
  }
}

unsigned char DBGU_read()    // 수신 함수
{
  while(0 == (DBGU_SR & 0x0001));
  return DBGU_RHR;
}

void intToChar(char *buf, int num)  // int 형을 Char형으로 변환
{
  int i, j;
  int target;    // 각 자 리수
  int value = 1;  // 숫자 크기 확인
  
  while(value < num)
  {
    value *= 10;
  }  
  
  for(i = 0, j = value/10 ; j >= 10 ; j /= 10)
  {
    target = num / j;
    num = num % j;
    buf[i++] = target + 48;    // buf에 문자값 저장
  }
  buf[i++] = num + 48;
  buf[i] = '\0';
}

int main(void)
{
  int num = 0;
  char buf[20];
  
  // PMC setting
  PMC_PCER = (unsigned int)1 << 2;    // PMC_PCER = (unsigned int)1 << 2;

  DBGU_CR = (1<<2)|(1<<3);      // 송수신부 리셋 및 금지  
  
  // PIO setting
  PIO_PDR = (1<<9)|(1<<10);  // 병렬 포트 사용 금지
  PIO_ASR = (1<<9)|(1<<10);  // 장치 A 사용
  PIO_BSR = 0;        // 장치 B 사용 금지

  // DBGU setting
  DBGU_MR = (1<<11);      // Parity 사용하 지 않음
  DBGU_BRGR = 313;      // Baud rate = 9600
  DBGU_CR = (1<<6)|(1<<4);  // tx, rx enable

  intToChar(buf, num);
  
  while(1)
  {
    intToChar(buf, num++);
    DBGU_write(buf);
    if(num == 9)
      num = 0;
  }
  
  return 0;
// End Main....
// 정수형을 문자로 전송하기 위해서 intToChar함수를 따로 작성하였다. 송신 함수도 문자열을 전송할 수 있게 수정하였다.


+ Recent posts