#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 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) // 인터럽트 설정 레지스터
int flag=0;
// unsigned int menu_index[3]=0;
unsigned int LED_NUM=0;
unsigned int DELAY_TIME=0
unsigned int LED_SUM=0;
unsigned char STACK;
int num;
//void LED_NUMBER(void);
//unsigned int LED_DELAY(void);
//--------- 딜레이 함수
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_SR 의 TXRDY=1송신 가능 상태이면
DBGU_THR = data;// 함수로 부터 받아온 데이타를 수신 버퍼에 넣어라
}
// 문자열 전달 함수 --------------------------------------------------------------
void DBGU_STRING(char * string) //문자를 받아 송신버퍼에 전달하는 함수
{
while((*string!='\0'))
{
DBGU_TX_char(* string);
string++; //포인터 값 증가
}
}
// 메뉴----------------------------------------------------------------------------
void MENU()
{
DBGU_STRING("1 LED 갯수 입력\n\r");
DBGU_STRING("2 DELAY 시간간격 입력\n\r" );
DBGU_STRING("3 STRAT\r\n");
DBGU_STRING("4 STOP\n\r");
DBGU_STRING("5 PIT\n\r");
DBGU_STRING("6 CDS(A/D컨버터)\n\r");
}
//---------------------------문자 변환 함수 -------------------------------
/*void itoa(void)//배열의 인덱스+1 i= 배열의 할당받을 갯수 즉 변환할 (문자->숫자)의 갯수이다
{
unsigned int s;// 루프돌릴 변수
unsigned char temp;// 임시버퍼를 받는 변수
unsigned char BUFF[5]; // 5자리정수 받을 공간
unsigned int val=0;// 복원되는 최종값
unsigned int number=1;// 자리수 곱해질값
// unsigned int i;
temp = DBGU_RHR;//
if(temp<48 || temp >58)//0~9 범위 이외의 출력값 발생 ====> error!!askii 48(h)=0(d) 57(h)=9(d)
DBGU_STRING("ERROR 0~9숫자 입력");
else
{
for(s=0;s<5;s++)
BUFF[s]=0;// 임의의 5칸 배열의 초기화
for(s=0;s<5;s++)
BUFF[s]=temp-48;// 임의의 5칸 배열의 초기화
if(s==5)// 6자리째가 되면
{
for(s=4;s<=0;s--)
{
val+=BUFF[s]*number;// 자리수를 곱해준다
number*=10;// 자릿수 증가
}
}
s=0;
}
}
*/
/* else if(i==1)
{
if(temp < '0' || temp > '9')// 0~9 이외의 값은 에러처리함
{
DBGU_string("error");
count =0;
return;
}
if(count ==0)// 배열의 초기화
{
for(num =0 ; num <25; num++)
{
pch[num]=0;
}
}
pch[count] = temp-48;//아스키코드 문자를 숫자로 변환
count++;//인덱스값 증가
if(count == 5)//자리수 5까지
{
num =1;
val =0;
for(count =4; count>=0; count--)// 인덱스 값에 맞추어 돌림
{
val+=pch[count]*num;// 낮은자리수 부터 구해서 쌓음
num *= 10;// 자리수 올리기 높은 자리 먼저 배열 인덱스 0~4저장하고 증가시킴 가장 낮은수는 인덱스 4
}
val =val *10 -12;
DBGU_Int(pch, val);// 배열에 초기 주소와 최종 값을 전송
count =0;// 다시초기화
i=0;;// 다시초기화
}
}
}
*/
//--------------------------------------------//LED 불키는 함수
/*void DBGU_RX_char(void) //LED 불키는 함수
{
static int flag=0;
// flag ^=0x01; //^<<< XOR 연산자 같으면0 다르면 1
if(flag==0)
{
PIO_SODR =0x000000ff;
flag=1;
Delayms(500);
}
else
{
PIO_CODR =0x000000ff;
flag=0;
Delayms(500);
DBGU_TX_char(DBGU_RHR);
}
}*/
//=============인 터 럽 트 메 인 ================================
void DBGU_RX_ISR(void)
{
//PIT 카운터 레지스터. PICNT 가장최근의 PIVR의 데이타 저장 12비트 // CPIV: 현재 주기적시간 간격 타이머값 나타냄 20비트
STACK = DBGU_RHR; // 인터럽트 서비스 루틴의 핵심
if(DBGU_SR && 0x01==1)//RXRDY=1 수신된 데이타가 있으면
{
if(STACK<'1' && STACK>'6')
{ DBGU_STRING("\n\r1번매뉴~6번 메뉴 사이의 범위값을 입력하세요 \n\r");
return;
}
else
{
if(STACK=='1')//메뉴가 2일때
{
flag=10;
DBGU_STRING("\n\r1번매뉴 flag=10인식\n\r");
}
else if(STACK=='2')//메뉴가 2일때
{
flag=11;
DBGU_STRING("\n\r2번매뉴 flag=11인식\n\r");
}
else if(STACK=='3')
{
flag=12;
DBGU_STRING(" \n\r스타트매뉴 \n\r");
}
else if(STACK=='4')
{
PIO_CODR = 0xff;
return;
}
//------------------------------ 기능 구현부------------------------------------------+-
else if(flag==10)//LED 갯수 입력
//if(DBGU_SR && 0x01==1)//RXRDY==1//LED 갯수 LEN_NUM 에 숫자변환 후 저장
{
DBGU_STRING("\n\r1-2번매뉴 글자 넘김 \n\r");
LED_NUM=STACK-48;//입력된 값을 LED_NUM에 저장
}
else if(flag==11)//딜레이 시간 설정
{
DBGU_STRING("\n\r1-2번매뉴 글자 넘김 \n\r");
DELAY_TIME=STACK-48;//입력된 값을 DELAY_TIME에 저장
}
//------------------ START 함수 -----------------------------------------------------
else if(flag==12)
{
if(LED_NUM!=0 && DELAY_TIME!=0)// led 갯수 와 delay 시간이 설정완료되어야 돈다
{
for(num=0;num<LED_NUM;num++)
{
// LED_SUM|=1<<num;// led 켤 2진수 지정
PIO_SODR=1<<num; //켬
Delayms(DELAY_TIME);
PIO_CODR=0x0F; //끔
Delayms(DELAY_TIME);
}
/* while(STACK=!'4') // 4 스탑버튼이 눌러지면 멈춘다
{
PIO_SODR=LED_SUM; //켬
Delayms(DELAY_TIME);
PIO_CODR=0x0F; //끔
Delayms(DELAY_TIME);
}*/
}
//------------LED 겟수 다시 입력함수------------------------------------
else if(LED_NUM == 0)
{
DBGU_STRING("2 LED 갯수를 다시입력하세요");
flag=10;
}
// ---------------DELAY 시간 설정함수 ---------------------------------
else if(DELAY_TIME==0)
{
DBGU_STRING("3 시간 설정을 다시하세요");
flag=11;
}
}
}
}
int main(void)
{
PMC_PCER=(unsigned int)1<<2;
Delayms(50);
PIO_OER=0x000000ff;
PIO_CODR=0x000000ff;
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_ISR; // 서비스 루틴 등록
AIC_SMR[1]=0x07; //인터럽트 모드 우선순위 설정
AIC_ICCR=(unsigned int)1<<1;// sys 인터럽트
AIC_IECR=(unsigned int)1<<1;// 인터럽트 허용
DBGU_STRING("하이퍼 터미널 시작\n\r");
MENU();
return 0;
}
'최근작업 삽질방' 카테고리의 다른 글
문서검색 금요일 (0) | 2010.08.20 |
---|---|
arm ex (0) | 2010.01.21 |
영상처리 라벨링 - 자료구조 나무뿌리 먼져타기 삽질중 (0) | 2010.01.12 |
미니프로젝트 영상처리 버튼 오류진행중. (0) | 2010.01.06 |
1-3일 삽질 (0) | 2010.01.04 |