#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) // 인터럽트 설정 레지스터
static int flag=0;
// unsigned int menu_index[3]=0;
unsigned int LED_NUM=0;
unsigned int DELAY_TIME=0;
int num;
unsigned int LED_SUM=0;
unsigned char STACK;
//--------- 딜레이 함수
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)
{
STACK=DBGU_RHR;
}
/* //=============인 터 럽 트 메 인 ================================
void DBGU_RX_ISR(void)
{
static unsigned char temp[4];
unsigned int num=1, i;
unsigned int p;
unsigned char status;
p=(unsigned int)PIT_PIVR;
//PIT 카운터 레지스터. PICNT 가장최근의 PIVR의 데이타 저장 12비트 // CPIV: 현재 주기적시간 간격 타이머값 나타냄 20비트
status = DBGU_RHR; // 인터럽트 서비스 루틴의 핵심
*/
//------------LED 겟수 입력함수------------------------------------
unsigned int LED_NUMBER(void)
{
DBGU_STRING("키고자하는 LED 갯수는?(1~4) 입력\n\r");
//menu_index[0]=1;//
if(DBGU_SR&&0x01==1)//RXRDY==1);
{
LED_NUM=DBGU_RHR;//입력된 값을 LED_NUM에 저장
}
}
// ---------------DELAY 시간 설정함수 ---------------------------------
unsigned int LED_DELAY(void)
{
DBGU_STRING("DELAY 시간간격 입력");
while(DBGU_SR==0x01)//RXRDY==1
DELAY_TIME=DBGU_RHR;
}
//------------------ START 함수 -----------------------------------------------------
void START(void)
{
if(LED_NUM!=0 && DELAY_TIME!=0)// led 갯수 와 delay 시간이 설정완료되어야 돈다
{
for(num=0;num<LED_NUM;num++)
{
LED_SUM |=1<<num;// led 켤 2진수 지정
}
while(flag!=1) // 4 스탑버튼이 눌러지면 멈춘다
{
PIO_SODR=LED_SUM; //켬
Delayms(DELAY_TIME);
PIO_CODR=0x0F; //끔
Delayms(DELAY_TIME);
}
}
else if(LED_NUM ==0)//
{DBGU_STRING("2 LED 갯수를 다시입력하세요");
LED_NUMBER();
DBGU_STRING("개\n\r");;
}
else if(DELAY_TIME==0)
{DBGU_STRING("3 시간 설정을 다시하세요");
LED_DELAY();
}
}
//----------------------------STOP함수-----------------------
void STOP(void)
{
PIO_CODR = 0xff;
}
int main(void)
{
unsigned int i, RxD;
unsigned int data;
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();
if(DBGU_SR == 0x01)//RXRDY=1 수신된 데이타가 있으면
{
if(STACK==1) //메뉴가 1일때
LED_NUMBER();
else if(STACK==2)
Delayms(DELAY_TIME);
else if(STACK==3)
START();
else if(STACK==4)
{
STOP();
flag=1;
}
/*else if(DBGU_RHR==5)
{
CDS_AD(int);
}
*/
}
return 0;
}
'최근작업 삽질방' 카테고리의 다른 글
arm ex (0) | 2010.01.21 |
---|---|
영상처리 라벨링 - 자료구조 나무뿌리 먼져타기 삽질중 (0) | 2010.01.12 |
미니프로젝트 영상처리 버튼 오류진행중. (0) | 2010.01.06 |
1-3일 삽질 (0) | 2010.01.04 |
1228 삽질2 (0) | 2009.12.28 |