본문 바로가기

최근작업 삽질방

암삽질중1/21

#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;
}