#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)//주변장치 A로 선택
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)//주변장치 B로 선택
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)//병렬 입출력 포트로 사용 금지
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410) //출력버퍼 사용 설정
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) //풀업저항 사용하지 않음
#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) //글리치 필터 사용허가 레지스터
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440) //인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C) //인터럽트 스테이터스 레지스터
#define PIO_ODR (*(volatile unsigned int *) 0xFFFFF414) //인터럽트 금지 레지스터
//----------------------------------------------------------------------------------
//---------- 전력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define MASTERCLOCK 48000000
//---------------------------------------------------------------------------------
//--------- AIC (인터럽트 ) 설정
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터
#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080) // 인터럽트 서비스 루틴 등록
#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000) // 인터럽트 설정
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) //에지 검출기 클리어
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허용 레지스터
//----------------------------------------------------------------------------------
//--------- 디버그유닛 레지스터
#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220) //보레이트 설정 레지스터
#define DBGU_MR (*(volatile unsigned int *) 0xFFFFF204) //모드 레지스터 (모드 설정, 패리티 설정)
#define DBGU_CR (*(volatile unsigned int *) 0xFFFFF200) //제어 레지스터 (송수신 설정)
#define DBGU_SR (*(volatile unsigned int *) 0xFFFFF214) //상태 레지스터
#define DBGU_THR (*(volatile unsigned int *) 0xFFFFF21C) // 송신 홀딩 레지스터
#define DBGU_RHR (*(volatile unsigned int *) 0xFFFFF218) // 수신 홀딩 레지스터
// 디버그 유닛 인터럽트 설정
#define DBGU_IER (*(volatile unsigned int *) 0xFFFFF208) // 디버그 유닛 인에이블
//----------------------------------------------------------------------------------
// ADC레지스터 설정
#define ADC_CR (*(volatile unsigned int *) 0xFFFD8000) // ADC제어 레지스터 ADC변환 시작/ADC 내부 하드웨어 리셋처러 리셋 설정
#define ADC_MR (*(volatile unsigned int *) 0xFFFD8004) // ADC 모드 제어 레지스터
#define ADC_CHER (*(volatile unsigned int *) 0xFFFD8010) // ADC 채널 허용 레지스터
#define ADC_SR (*(volatile unsigned int *) 0xFFFD801C) //ADC 상태 레지스터
#define ADC_CDR ((volatile unsigned int *) 0xFFFD8030) //ADC 채널 데이터 레지스터
//----------------------------------------------------------------------------------
//--------- 사용자 정의 함수
void Myitoa(char* pch,int val); // itoa 함수
void Dbug_Init(); //디버그 유닛 사용 설정
void Delayms(unsigned int ms); //딜레이 함수..
void DBGU_TX_char(unsigned int data); //송신 함수
void DBGU_TX_String(unsigned char* data);
void ZeroMemory(void* mr,int count,int size);
void DBGU_RX_char(void); //수신 함수
void DBGU_TX_value(unsigned int val); //숫자 전송 함수
void Check_Tx(); //DEBUG CHECK Message
//----------------------------------------------------------------------------------
int main(void)
{
unsigned int sum,i;
unsigned int ADval;
char val[15];
ADval=0;
PMC_PCER=(unsigned int)1<<2; //pioa 사용 함
PIO_PER=0x0F;
PIO_PUDR=1<<3;
PIO_OER=1<<3;
PMC_PCER=(unsigned int)1<<4; //ADC 사용 함
ADC_CR = 0x01; //AD리셋
Delayms(50);
ADC_MR = 0x02020400; // SHTIM=2 (sample & hold time = 625ns)
// 4.8MHz, 10 bit, software trigger
ADC_CHER=(unsigned int)0x1<<4; //CH4 선택
Dbug_Init(); //디버그 유닛 사용
while(1){
ADval=0;
Check_Tx(); //Check Data Send
Delayms(1000);
sum = 0;
for(i=0; i<32; i++)
{
ADC_CR=1<<1; //ADC 변환 시작
while(!(ADval&0x10)) // 4번 채널 변환 완료 대기
ADval = ADC_SR; // ADC의 상태를 읽어옴
sum += ADC_CDR[4]; // 4번 채널 ADC 변환 값 확인
Delayms(1);
}
sum >>= 5;
DBGU_TX_value(sum);
}
return 0;
} // End Main....
//----------------------------------------------------------------------------------------
//---------------- 함수 원형 --------------------------
//----------------------------------------------------------------------------------------
void Delayms(unsigned int ms) //딜레이 함수..
{
volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
//--------------------------------
void DBGU_TX_char(unsigned int data)
{
while(!(DBGU_SR & 0x0002)); //송신 가능 상태이면
DBGU_THR = data;
}
//--------------------------------
void DBGU_TX_String(unsigned char* data)
{
while(*data!=0)
{
while(!(DBGU_SR & 0x0002)); //송신 가능 상태이면
DBGU_THR = *data;
data++;
}
DBGU_TX_char('\n');
DBGU_TX_char('\r');
}
//--------------------------------
void DBGU_TX_value(unsigned int val)
{
char data[20];
ZeroMemory(data,20,1); //메모리 초기화
Myitoa(data,val);
DBGU_TX_String((unsigned char*)data);
}
//--------------------------------
//----------------------------------
void DBGU_RX_char(void)
{
static int flag=0;
flag ^=0x01;
if(flag)
PIO_SODR =0x0000000f;
else
PIO_CODR =0x0000000f;
DBGU_TX_char(DBGU_RHR);
}
//--------------------------------
void Dbug_Init()//디버그 유닛 사용 설정
{
PIO_ASR=(unsigned int)1<<9|(unsigned int)1<<10;//주변 장치 A로 PA9,PA10번 사용
PIO_PDR=(unsigned int)1<<9|(unsigned int)1<<10;//
DBGU_MR =0x00000800;// chmode = 정상 모드
// par= 패리티 사용 하지 않음
DBGU_BRGR = 26; //보레이트 설정 115200
DBGU_CR =0x00000150;//송신부 수신부 동작 시작
DBGU_IER= 0x01; //수신 인터럽트 설정
//인터럽트 설정 부분
AIC_IDCR = (unsigned int) 1 <<1;// PIOA
AIC_SVR[1] = (unsigned int) DBGU_RX_char; // 서비스 루틴 등록
AIC_SMR[1] = 0x07; //인터럽트 모드 우선순위 설정
AIC_ICCR=(unsigned int) 1 <<1;// sys 인터럽트
AIC_IECR = (unsigned int) 1 <<1;// 인터럽트 허용
}
//--------------------------------
void Myitoa(char* pch,int val)
{
int count,num,i;
count =-1;
num =1;
while(num < val)
{
num *=10;
count++;
}
num /=10;
for(i=0; i<=count; i++)
{
pch[i]= (val/num);
val = val-pch[i]*num;
pch[i]+=48;
num/=10;
}
}
//----------------
void ZeroMemory(void* mr,int count,int size)
{
int num;
if(size ==1)
{
for(num=0; num<count; num++)
{
(*(char *)mr) =0;
((char *)mr)++;
}
}
else if(size == 4)
{
for(num=0; num<count; num++)
{
(*(int *)mr) =0;
((int *)mr)++;
}
}
}
//----------------
void Check_Tx()
{
DBGU_TX_char('C');
DBGU_TX_char('h');
DBGU_TX_char('e');
DBGU_TX_char('c');
DBGU_TX_char('k');
DBGU_TX_char('\n');
DBGU_TX_char('\r');
}
'About 프로그래밍!!! > ARM' 카테고리의 다른 글
[ARM]링크드리스트 하기전에.. (0) | 2010.07.14 |
---|---|
[ARM]프로젝트(통신) (0) | 2010.07.13 |
[ARM] ADC (0) | 2010.07.13 |
[ARM]캐릭터 LCD (0) | 2010.07.09 |
[ARM] 캐릭터 LCD에 글자쓰기 (0) | 2010.07.09 |