시리얼 통신
ECHO 예제
// DBGU를 이용하여 간단한 시리얼 통신을 해보았다. PC 터미널에서 신호를 날리면 그 신호가 그대로 다시 돌아와서 PC 터미널에 찍히게 된다.
// 정수형 데이터를 문자로 변환하여 전송하는 프로그램
// 정수형을 문자로 전송하기 위해서 intToChar함수를 따로 작성하였다. 송신 함수도 문자열을 전송할 수 있게 수정하였다.
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....