최근작업 삽질방

1-3일 삽질

빛나는 미래 2010. 1. 4. 02:10


#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430)
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434)
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410)
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)
#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420)
#define PIO_PDSR (*(volatile unsigned int *) 0xFFFFF43C)
#define DBGU_SR (*(volatile unsigned int *) 0xFFFFF214)
#define DBGU_RHR (*(volatile unsigned int *) 0xFFFFF218)
#define DBGU_THR (*(volatile unsigned int *) 0xFFFFF21C)
#define PMC_SCER (*(volatile unsigned int *) 0xFFFFFC00)
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400)
#define DBGU_MR (*(volatile unsigned int *) 0xFFFFF204)
#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220)
#define DBGU_CR (*(volatile unsigned int *) 0xFFFFF200)
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440)  //인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)  //인터럽트 스테이터스 레지스터
#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080)    //  인터럽트 서비스 루틴 등록
#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000)   //   인터럽트 설정
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) //에지 검출기 클리어
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허용 레지스터

#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460)

#define PITC_PIMR (*(volatile unsigned int *) 0xFFFFFD30)
#define PITC_PIVR (*(volatile unsigned int *) 0xFFFFFD38)


               //-디버그 유닛 인터럽트 설정-//
#define DBGU_IER (*(volatile unsigned int *) 0xFFFFF208)   // 인터럽트 설정 레지스터

//volatile 레지스터 주소 (보레타일)

//---------- 전력 제어 설정

#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)

 
#define MASTERCLOCK 48000000 //ARM에서 사용하는 클럭수
 

//--------- 전역 변수

void Delayms(unsigned int ms) //딜레이 함수..
{
  volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;

  for(count = 0; count < countmax; count++);
}


volatile unsigned int PIT_count=0;  // PIT interrupt count
volatile unsigned int PIT_flag=0;  // PIT interrupt flag
unsigned int Hz=0;      //주기타이머 Hz 보정값
unsigned int k=0x0;      //led값 저장변수
unsigned int num=0;
unsigned int val=0;
static int flag=0; 


void DBGU_TX_char(unsigned int data)  /* transmit a character by DBGU */
{
  while(!(DBGU_SR & 0x0002));  // wait until TXRDY=1

  DBGU_THR = data;   // transmit a character
}


void DBGU_string(char *string)   /* transmit a string by DBGU */
{
  while(*string != '\0')
    { DBGU_TX_char(*string);
       string++;
    }
}

 


void Ledctrl(int val)  //계산된 값에 따른 led켜기 함수
{
 int i,j=0;
 PIO_CODR=0xff;
 for(i=0;i<val;i++)
 {
  j |=1<<i;
 }
 PIO_SODR = j;
}

 

unsigned int DBGU_RX_char(void)   /* receive a character by DBGU */
{
 while(!(DBGU_SR & 0x0001));  // wait until RXRDY=1
 return DBGU_RHR;   // receive a character
}
  


void PIT_ISR(void)    /* PIT interrupt service routine */
{
  unsigned int status;
  //AT91F_PITGetPIVR(AT91C_BASE_PITC);  // clear PITS 
  int temp;
 
  static int count=0;
  static char pch[10];
 
  if(DBGU_SR & 0x01)
  {
   temp=DBGU_RHR;
 if(temp == '1' && flag==1) //led메뉴 선택시
 {     
  DBGU_string("\rLED 갯수 입력: ");
  flag=10;
 }
 /*else if(temp == '2' && flag==1)
 {
  DBGU_string("\r시간 입력: ");
  flag=2;
 }
 else if(temp == '3' && flag==1) 
 {  
  DBGU_string("\rSTART!\r\n");
  PIT_count=Hz;
  flag=5;
 }
 else if(temp == '4' && flag==5) 
 {  
  DBGU_string("\rSTOP!\r\n\n");  
  PIT_count=0;
  PIO_CODR=0xff;  
  flag=0;
 }

 else if(flag==2)
 {  
  if(temp==13) //입력값이 13(리턴)이라면
  {
   flag=3;
   DBGU_string("\r\n");
   Hz=0;
   num =1;
   val =0;
   count--;  //배열은 0부터 시작이므로 -1
   for( ;count>=0; count--)
   {
    Hz+=pch[count]*num;
    num *= 10;
   }   

   flag=1;
   count =0;
   return;
  }
  else if(temp < '0' || temp > '9')
  {
   DBGU_string("\r\nError!\n");      
   Hz=0;
   flag=0;
   count=0;
   return;
  }

  if(count ==0)  //0일때 초기화
  { 
   for(num =0 ; num <10; num++)
   {
    pch[num]=0;
   } 
  }

  pch[count] = temp-48; //수신값 입력
  count++;
  return;
 }
*/
 
 else if(flag==10)
 {  
  if(temp < '0' || temp > '9')
  {
   DBGU_string("\r\nError!\n");      
   k=0;
   flag=0;
   return;
  }
  DBGU_string("\r\n");
  k=temp;
  k-=48;
  flag=1;
  DBGU_string("\r\n 1번 메뉴 입력값 먹음\n");
 }   
   return;
  }
 
 /*
  status=PITC_PIVR;
 
  if(flag!=5)
   return;

  PIT_count++;     // increment PIT_count

  if(PIT_count < Hz)    // 5Hz/10 = 0.5Hz
    return;

  PIT_count = 0;    // if PIT_count=10, clear it
  PIT_flag ^= 0x01;    // toggle PIT_flag

  if(PIT_flag == 1)    //
  {
    Ledctrl(k);   
  }
  else      // if PIT_flag=0, LED2 off
  {
    PIO_CODR=0xff;    
  }
}

void Initscreen(void)
{
 DBGU_TX_char('\r');
 DBGU_string("--MENU--\n\r");
 DBGU_string("1. LED\n\r");
 DBGU_string("2. PIT\n\r");
 DBGU_string("3. START\n\r");
 DBGU_string("4. STOP\n\r");
}

 

int main(void)
{  

  PIO_OER = 0x00000FFF;
  PIO_CODR = 0xFFF;
    // enable clock of DBGU
  PMC_PCER=(unsigned int)1 << 2;
 
       // DTXD, DRXD by Peripheral A
  PIO_ASR = (unsigned int) 1 << 10 | (unsigned int) 1 <<  9;
  PIO_BSR = 0;
  PIO_PDR = (unsigned int) 1 << 10 | (unsigned int) 1 <<  9;
 
        // enable peripheral clock for PIT
  PMC_PCER = (unsigned int) 1 << 1;
  PMC_PCER = (unsigned int) 1 << 2;  // enable clock of DBGU

      // enable and initialize PIT
  PITC_PIMR = (1 * 48 + 8)>>4;
 
  PITC_PIMR = 300000-1;

  DBGU_MR = 0x00000800;   // normal mode, no parity
  DBGU_BRGR = 26;   // MCK/16/26 = 115200 bps
  DBGU_CR = 0x00000150;   // TX, RX enable
 
  DBGU_IER = 0x1; //수신 인터럽트 설정

 
  PITC_PIMR |= (unsigned int) 0x1 << 24;
  PITC_PIMR |= (unsigned int) 0x1 << 25;
 

  AIC_IDCR=(unsigned int)1<<1;
  AIC_SVR[1]=(unsigned int)PIT_ISR;
  AIC_SMR[1]=7;
  AIC_ICCR=(unsigned int)1<<1; //sys 인터럽트
 
  AIC_IECR = (unsigned int) 1 <<1;// 인터럽트 허용
 
 
  while(1)
  {   
   
   if(flag==0)
   {
    Initscreen(); //초기메뉴 출력
    flag=1;
   }    

  }   
   
}