본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-강혜정-20100625

by 알 수 없는 사용자 2010. 6. 26.
728x90
반응형

#ARM인터럽트실습

예제 1.  4번에 interrupt, 8번에는 인터럽트를 발생시켜보았다.

 

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//---------- 입출력 IO설정
#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)
#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_PUER  (*(volatile unsigned int *) 0xFFFFF464)

#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) //
글리치 필터 사용허가 레지스터
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440)  //
인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)

//----------AIC 
인터럽트 설정
#define AIC_IECR  (*(volatile unsigned int *) 0xFFFFF120)
#define AIC_SMR  (*(volatile unsigned int *) 0xFFFFF008)
#define AIC_SVR  (*(volatile unsigned int *) 0xFFFFF088)
#define AIC_IDCR  (*(volatile unsigned int *) 0xFFFFF124)
#define AIC_ICCR  (*(volatile unsigned int *) 0xFFFFF128)

//---------- 
전력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define MASTERCLOCK 48000000

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

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

int interrupt(void)
{
    PIO_SODR = 0x00000010;
    Delayms(300);
    PIO_CODR = 0x00000010;     //
인터럽트가 발생하면, 1번실행되고 종료한다.
    Delayms(300);
}


int main(void)
{
    PMC_PCER=0x00000004;   //PID2
 클록의 공급을 허용

    PIO_PER=0x00000110;        

//2진수: 0x0000 0000 0000 0000 0000 0000 0001 0001 0000 = 16진수 : 0x0000 0004이다

//p8 인터럽트이고, p4 led이다.
    PIO_PUER=0x00000100;
    PIO_IER=0x00000100;
    PIO_IFER=0x00000100;
    PIO_SODR=0x00000000;

    AIC_IECR=0x00000004;   //PID2
 1 설정하여 인터럽트를 허용해준다.
    AIC_SMR=0x00000066;        //2
진수로 나타내면 : 110 0110이다

//중요한건 110 나타내는 6인데이것은 11 나타내며 POSITIVE edge trigger이다


    AIC_SVR=(unsigned int)interrupt;

    while(1)
    {

    }
    return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

결과는 인터럽트가 한번 발생하고 종료하게 된다.

 

 

 

 

 

예제 2.  4번에 interrupt, 8번에는 인터럽트를 발생하는데, 스위치를 연결하여 누를때마다 인터럽트가 동작하는 실습

 

이때는 PIO_ISR레지스터를 설정해줘야 한다. 병렬 I/O포트의 각 핀에서 rising edge falling edge가 발생하면 병렬 입출력 제어기 인터럽트를 요청하도록 설정할 수 있따. 이러한 입력신호의 상채변화는 PIO_ISR 레지스터에 저장되어 인터럽트를 요청하며, 소프트웨어로 이 레지스터를 읽으면 모든 비트가 클리어된다.

두번째 실습은 define설정과 ISR설정 부분만 간략하게 나타내었다.

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////.

#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)
//define
설정인터럽트에도 AIC_ISR레지스터가 있다구분하여 사용해야한다.



int interrupt(void)
{

        int clear;
      PIO_SODR = 0x00000010;
        Delayms(300);
        PIO_CODR = 0x00000010;     //
인터럽트가 발생하면, 1번실행되고 종료한다.
        Delayms(300);
        clear = PIO_ISR;


    return 0;
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

이렇게 설정을 해주면, ISR레지스터 특성상, read되는 순간 클리어 되므로, 스위치를 누를때 마다 인터럽트가 실행되는걸 확인해 있다.



728x90