Microprocessor/ARM7 ARM7 자료 ( AIC / AIC Interrupt Controller )
  • 728x90
    반응형

       

       

      안녕하세요 L입니다.

     

    오늘은 ARM7 AIC 이용해 Interrupt 구현해 보았습니다

     

     

     

     

     

       

     

     

     

     Advanced Interrupt Controller (AIC)

     

     

       

       

    ※ spec :: 183p

       

     

     

     

       

    8개의 Interrupt(중단하다, 끼어들다) 운선순위에 따라 개별적으로

       32개의 pin Interrupt 제어할 있다.

       

     

     IRQ : Interrupt 들어왔다.

       

     

     FIQ : 패스트 인트럽트

       

     

    각 핀마다 레벨을 다르게 줄수 있다.

       

     

    0V, 3V 전압에 민감하게 만들거나 모서리에 민감하게 프로그래밍 할 수 있다.

       

       

     

    [ cstartup .S ]

       

       

     

     

     reset value (ARM) :: Initial value (AVR) ::

       

     

     PC (ARM) :: IP(인텔) :: 명령의 주소

       

     

    ATMEL ARM에서는 reset 주소값은 0번지부터 시작한다.

       

       

       

     

    ldr : 대입 연산자

       

     

    b : 점프

       

     

    PC : 프로그램 카운터

       

       

       

     

    [ swi_vector ]

    소프트웨억 발생시키는 Interrupt.

       

       

       

    [ pabt_vector ]

    ※ spec :: 16p

       

     

       

    명령어 수행 단계

     

       

    ARM 의 속도를 빠르게 하기위해 3단 pipe가 존재

       

       

       

    [ IRQ ]

       

    하드웨어에서 발생하는 Interrupt.

       

       

       

       

    [ FIQ ]

       

       

     

       

    점프하지않고 현재위치에서 코드를 처리한다.

       

     

    가장 먼저 실행되어야 할부분을 fiq 바로 아래 위치시키면 빠르게 처리할 수 있다.

       

     

    라벨로 점프하여 처리되기 때문에 주소값이 밀릴 걱정은 없다.

       

     

       

    ※ spec :: 183p

       

       

     

     

    Embedded Peripheral : FIQ, IRQ 에 연결 되어 있다.

        

     

     

       

       

     

    FIQ, IRQ 핀 외의 것은 외부장치를 나타낸다.

       

     

    Wake UP : 슬립모드

       

     

    FIQ, IRQ : PIO 컨트롤을 거치므로 PIO를 세팅해야 사용가능하다.

       

     

       

    [ PIO 세팅 ]

       

       

     

     

     

       

     

    Interrupt가 처리된후 지워지지 않음으로 아무 값이나 넣어 함수종료 부분에 위치 시킨다.

       

     

     

       

       

       

       

     

     

    VECTOR : 주소

       

     

     

    AIC 함수 VECTOR 을 받는다.

     

     

       

       

       

       

       

     

       

    사용자는 우선순위 레벨을 0~7 에서 0으로 사용 하였다.

       

     

       

     

     

     

       

    외부에서 신호를 받음으로 External Interrupt 사용

       

     

     

       

     

     

    즉 하강 엣지는 1로 주고 우선순위는 0으로 줌

       

     

       

       

     

     

    Glitch Input Fliter 활성

       

     

     

       

       

       

       

     

     

    PIOA Interrupt 를 set 한다.

       

     

       

       

       

       

       

       

     

       

       

       

     

       

       

     

     

       

       

     

    PIO_ISR : 위와 같이 정의하면 한번 read 된다.

       

     

    위 소스는 글리치 필터와 같이 잡음제거 역할을 하게 된다.

       

     

    바로아래 딜레이를 걸어 잡음을 확실하게 제거한다.

       

     

       

       

    ※ spec :: 187p

       

     

     

    위의 회로도에따라 필요한 레지스터를 활성화 시키고 코드를 작성한다.

       

       

       

    Ex) AIC 인터럽트 발생 실습

       

       

    [ 헤더 파일 ]

    ////////////////////////////////////////////////////////////////////////
    ///////////                [ 2012. 07. 18.By.L ]              //////////
    ///////////      REF ::  6175G.ATARM.22- Nov- 60 :: SPEC      //////////
    ////////////////////////////////////////////////////////////////////////
    #ifndef __ARM_H__
    #define __ARM_H__



    /*=========================================================================
    [ Parallel Input Output Controller ( PIO > : SPEC :: P.88 ]================
    ===========================================================================*/

    #define   PIO_PER     (*((volatile unsigned int *)0xFFFFF400)) 
    #define    PIO_PDR    (*((volatile unsigned int *)0xFFFFF404)) 
    #define    PIO_PSR    (*((volatile unsigned int *)0xFFFFF408)) 
    //<Reserved>===================================================
    #define    PIO_OER    (*((volatile unsigned int *)0xFFFFF410))   
    #define    PIO_ODR    (*((volatile unsigned int *)0xFFFFF414))   
    #define    PIO_OSR    (*((volatile unsigned int *)0xFFFFF418))  

    //<Reserved>===================================================
    #define    PIO_IFER   (*((volatile unsigned int *)0xFFFFF420))  
     
    #define    PIO_IFDR   (*((volatile unsigned int *)0xFFFFF424))   
    #define    PIO_IFSR   (*((volatile unsigned int *)0xFFFFF428))   
    //<Reserved>===================================================
    #define    PIO_SODR   (*((volatile unsigned int *)0xFFFFF430))  

    #define    PIO_CODR   (*((volatile unsigned int *)0xFFFFF434))   
    #define    PIO_ODSR   (*((volatile unsigned int *)0xFFFFF438))  
    #define    PIO_PDSR   (*((volatile unsigned int *)0xFFFFF43C)) 
    #define    PIO_IER    (*((volatile unsigned int *)0xFFFFF440))  
    #define    PIO_IDR    (*((volatile unsigned int *)0xFFFFF444))  
    #define    PIO_IMR    (*((volatile unsigned int *)0xFFFFF448))  
    #define    PIO_ISR    (*((volatile unsigned int *)0xFFFFF44C))
    #define    PIO_MDER   (*((volatile unsigned int *)0xFFFFF450))  
    #define    PIO_MDDR   (*((volatile unsigned int *)0xFFFFF454))  
    #define    PIO_MDSR   (*((volatile unsigned int *)0xFFFFF458))  
    //<Reserved>===================================================
    #define    PIO_PUDR   (*((volatile unsigned int *)0xFFFFF460))  
    #define    PIO_PUER   (*((volatile unsigned int *)0xFFFFF464))  
    #define    PIO_PUSR   (*((volatile unsigned int *)0xFFFFF468))  
    //<Reserved>===================================================
    #define    PIO_ASR    (*((volatile unsigned int *)0xFFFFF470)) 
    #define    PIO_BSR    (*((volatile unsigned int *)0xFFFFF474))  
    #define    PIO_ABSR   (*((volatile unsigned int *)0xFFFFF478))  
    //<Reserved>===================================================
    #define    PIO_OWER   (*((volatile unsigned int *)0xFFFFF4A0))  
    #define    PIO_OWDR   (*((volatile unsigned int *)0xFFFFF4A4))  
    #define    PIO_OWSR   (*((volatile unsigned int *)0xFFFFF4A8))  





    /*=========================================================================
    [ Power Management Controller ( PMC ) User Interface : SPEC :: P.222 ]=====
    ==========================================================================*/

    #define    PMC_PCER  (*((volatile unsigned int *)0xFFFFFC10))  
    #define    PMC_PCDR  (*((volatile unsigned int *)0xFFFFFC14))  
    #define    PMC_PCSR  (*((volatile unsigned int *)0xFFFFFC18))  




    /*=========================================================================
    [ Peripheral Identifiers : SPEC :: P.34 ]==================================
    ==========================================================================*/

    #define    AIC_FIQ        0    // Advanced Interrupt Controller
    #define    SYSC           1    // System
    #define    PIOA           2    // Parallel I/O Controller A      
    #define    ADC            4    // Analog-to Digital Converter
    #define    SPI            5    // Serial Peripheral Interface
    #define    US0            6    // USART 0
    #define    US1            7    // USART 1
    #define    SSC            8    // Synchronous Serial Controller
    #define    TWI            9    // Two-wire Interface
    #define    PWMC          10    // PWM Controller
    #define    UDP           11    // USB Device Port
    #define    TC0           12    // Timer/Counter 0
    #define    TC1           13    // Timer/Counter 1
    #define    TC2           14    // Timer/Counter 2
    #define    AIC_IRQ0      30    // Advanced Interrupt Controller
    #define    AIC_IRQ1      31    // Advanced Interrupt Controller


    /*======================================================================
    [ Advanced Interrupt Controller (AIC) : SPEC :: P.198 ]=================
    ========================================================================*/

    #define    AIC_SMR0    (*((volatile unsigned int *)0xFFFFF000))     
    #define    AIC_SMR1    (*((volatile unsigned int *)0xFFFFF004))    
    #define    AIC_SMR2    (*((volatile unsigned int *)0xFFFFF008))    
    #define    AIC_SMR3    (*((volatile unsigned int *)0xFFFFF00C))    
    #define    AIC_SMR4    (*((volatile unsigned int *)0xFFFFF010))    
    #define    AIC_SMR5    (*((volatile unsigned int *)0xFFFFF014))    
    #define    AIC_SMR6    (*((volatile unsigned int *)0xFFFFF018))    
    #define    AIC_SMR7    (*((volatile unsigned int *)0xFFFFF01C))    
    #define    AIC_SMR8    (*((volatile unsigned int *)0xFFFFF020))    
    #define    AIC_SMR9    (*((volatile unsigned int *)0xFFFFF024))    
    #define    AIC_SMR10   (*((volatile unsigned int *)0xFFFFF028))    
    #define    AIC_SMR11   (*((volatile unsigned int *)0xFFFFF02C))    
    #define    AIC_SMR12   (*((volatile unsigned int *)0xFFFFF030))    
    #define    AIC_SMR13   (*((volatile unsigned int *)0xFFFFF034))    
    #define    AIC_SMR14   (*((volatile unsigned int *)0xFFFFF038))    
    #define    AIC_SMR15   (*((volatile unsigned int *)0xFFFFF03C))    
    #define    AIC_SMR16   (*((volatile unsigned int *)0xFFFFF040))    
    #define    AIC_SMR17   (*((volatile unsigned int *)0xFFFFF044))    
    #define    AIC_SMR18   (*((volatile unsigned int *)0xFFFFF048))    
    #define    AIC_SMR19   (*((volatile unsigned int *)0xFFFFF04C))    
    #define    AIC_SMR20   (*((volatile unsigned int *)0xFFFFF050))    
    #define    AIC_SMR21   (*((volatile unsigned int *)0xFFFFF054))
    #define    AIC_SMR22   (*((volatile unsigned int *)0xFFFFF058))
    #define    AIC_SMR23   (*((volatile unsigned int *)0xFFFFF05C))
    #define    AIC_SMR24   (*((volatile unsigned int *)0xFFFFF060))
    #define    AIC_SMR25   (*((volatile unsigned int *)0xFFFFF064))
    #define    AIC_SMR26   (*((volatile unsigned int *)0xFFFFF068))
    #define    AIC_SMR27   (*((volatile unsigned int *)0xFFFFF06C))
    #define    AIC_SMR28   (*((volatile unsigned int *)0xFFFFF070))
    #define    AIC_SMR29   (*((volatile unsigned int *)0xFFFFF074))
    #define    AIC_SMR30   (*((volatile unsigned int *)0xFFFFF078))
    #define    AIC_SMR31   (*((volatile unsigned int *)0xFFFFF07C))
    #define    AIC_SVR0    (*((volatile unsigned int *)0xFFFFF080))     
    #define    AIC_SVR1    (*((volatile unsigned int *)0xFFFFF084))
    #define    AIC_SVR2    (*((volatile unsigned int *)0xFFFFF088))
    #define    AIC_SVR3    (*((volatile unsigned int *)0xFFFFF08C))
    #define    AIC_SVR4    (*((volatile unsigned int *)0xFFFFF090))
    #define    AIC_SVR5    (*((volatile unsigned int *)0xFFFFF094))
    #define    AIC_SVR6    (*((volatile unsigned int *)0xFFFFF098))
    #define    AIC_SVR7    (*((volatile unsigned int *)0xFFFFF09C))
    #define    AIC_SVR8    (*((volatile unsigned int *)0xFFFFF0A0))
    #define    AIC_SVR9    (*((volatile unsigned int *)0xFFFFF0A4))
    #define    AIC_SVR10   (*((volatile unsigned int *)0xFFFFF0A8))
    #define    AIC_SVR11   (*((volatile unsigned int *)0xFFFFF0AC))
    #define    AIC_SVR12   (*((volatile unsigned int *)0xFFFFF0B0))
    #define    AIC_SVR13   (*((volatile unsigned int *)0xFFFFF0B4))
    #define    AIC_SVR14   (*((volatile unsigned int *)0xFFFFF0B8))
    #define    AIC_SVR15   (*((volatile unsigned int *)0xFFFFF0BC))
    #define    AIC_SVR16   (*((volatile unsigned int *)0xFFFFF0C0))
    #define    AIC_SVR17   (*((volatile unsigned int *)0xFFFFF0C4))
    #define    AIC_SVR18   (*((volatile unsigned int *)0xFFFFF0C8))
    #define    AIC_SVR19   (*((volatile unsigned int *)0xFFFFF0CC))
    #define    AIC_SVR20   (*((volatile unsigned int *)0xFFFFF0D0))
    #define    AIC_SVR21   (*((volatile unsigned int *)0xFFFFF0D4))
    #define    AIC_SVR22   (*((volatile unsigned int *)0xFFFFF0D8))
    #define    AIC_SVR23   (*((volatile unsigned int *)0xFFFFF0DC))
    #define    AIC_SVR24   (*((volatile unsigned int *)0xFFFFF0E0))
    #define    AIC_SVR25   (*((volatile unsigned int *)0xFFFFF0E4))
    #define    AIC_SVR26   (*((volatile unsigned int *)0xFFFFF0E8))
    #define    AIC_SVR27   (*((volatile unsigned int *)0xFFFFF0EC))
    #define    AIC_SVR28   (*((volatile unsigned int *)0xFFFFF0F0))
    #define    AIC_SVR29   (*((volatile unsigned int *)0xFFFFF0F4))
    #define    AIC_SVR30   (*((volatile unsigned int *)0xFFFFF0F8))
    #define    AIC_SVR31   (*((volatile unsigned int *)0xFFFFF0FC))
    #define    AIC_IVR     (*((volatile unsigned int *)0xFFFFF100))     
    #define    AIC_FVR     (*((volatile unsigned int *)0xFFFFF104))     
    #define    AIC_ISR     (*((volatile unsigned int *)0xFFFFF108))     
    #define    AIC_IPR     (*((volatile unsigned int *)0xFFFFF10C))     
    #define    AIC_IMR     (*((volatile unsigned int *)0xFFFFF110))     
    #define    AIC_CISR    (*((volatile unsigned int *)0xFFFFF114))     
    //<Reserved>===================================================
    //<Reserved>===================================================
    #define    AIC_IECR    (*((volatile unsigned int *)0xFFFFF120))     
    #define    AIC_IDCR    (*((volatile unsigned int *)0xFFFFF124))     
    #define    AIC_ICCR    (*((volatile unsigned int *)0xFFFFF128))     
    #define    AIC_ISCR    (*((volatile unsigned int *)0xFFFFF12C))     
    #define    AIC_EOICR   (*((volatile unsigned int *)0xFFFFF130))     
    #define    AIC_SPU     (*((volatile unsigned int *)0xFFFFF134))     
    #define    AIC_DCR     (*((volatile unsigned int *)0xFFFFF138))     
    //<Reserved>==================================================
    #define    AIC_FFER    (*((volatile unsigned int *)0xFFFFF140))     
    #define    AIC_FFDR    (*((volatile unsigned int *)0xFFFFF144))     
    #define    AIC_FFSR    (*((volatile unsigned int *)0xFFFFF148))     

    #define    PRIOR      0
    #define    SRCTYPE    5
    #endif // __ARM_H__

       

       

    [ LED 헤더 파일 ]

    #ifndef __LED_H__
    #define  __LED_H__

    void Init_LED(void);
    void LED_toggle(void);

    #define LED_Pin    0  // LED Pin Number

    #endif // __LED_H__

       

       

    [ LED 함수 파일 ]

    #include "arm.h"
    #include "led.h"

    void Init_LED(void)
    {
      PMC_PCER = 1 << PIOA;      
      PIO_OWER = 1 << LED_Pin;
      PIO_PER  = 1 << LED_Pin;
      PIO_OER   = 1 << LED_Pin;
      PIO_SODR = 1 <<  LED_Pin;
      
      
    return ;
    }

    void LED_toggle(void)
    {
      
    if(0 != (PIO_ODSR & (1<<LED_Pin)))      // LED off 
    이면...
      {
        PIO_CODR = 1 <<  LED_Pin;
      }  
      
    else                    // LED on 
    이면...
      {
        PIO_SODR = 1 <<  LED_Pin;
      }
      
      
    return ;
    }

       

       

       

    [ AIC 헤더 파일 ]

    #ifndef    __AIC_H__
    #define    __AIC_H__

    void Init_AIC(void);
    void AIC_IRQ_Led(void);
    #define IRQ_Pin    15  // IRQ Pin Number

    #endif    //__AIC_H__

       

       

          

    [ AIC 함수 파일 ]

    #include "arm.h"
    #include "aic.h"
    #include "led.h"


    void Init_AIC(void)
    {
      PMC_PCER = 1 << PIOA;    // System Clock Enable
      
      PIO_ODR  = 1 << IRQ_Pin;    // Output Disable
      PIO_PER  = 1 << IRQ_Pin;    // PIO Enable
      PIO_IDR   = 1 << IRQ_Pin;    // Interrupt Disable
      
      AIC_IDCR = 1 << PIOA;    // Interrupt Disable Command 
      
      AIC_SVR2 = (
    unsigned int)AIC_IRQ_Led;
      AIC_SMR2 = (1 << SRCTYPE) | (0 <<PRIOR);   
      AIC_ICCR = 1 << PIOA;    // AIC Interrupt clear Command
      PIO_IFER = 1 << IRQ_Pin;    // Glitch Filter
      AIC_ISCR = 1 << PIOA;    // AIC Interrupt Set
      PIO_IER  = 1 << IRQ_Pin;    // PIO Interrupt Enable
      AIC_IECR = 1 << PIOA;    // AIC Interrupt Enable
      
    return ;
    }

    void AIC_IRQ_Led(void)
    {
      
    volatile unsigned int dly;
      
      
    if((1<<IRQ_Pin)==PIO_ISR)
      {

        LED_toggle();

      }
      
      
    for(dly = 0;300000 > dly; dly++);

      PIO_ISR;
      AIC_EOICR = 0;    // End of Interrupt 
      
    return ;
    }

       

       

       

    [ main 함수 파일 ]

    #include "arm.h"
    #include "led.h"
    #include "aic.h"

    //[ 
    함수 선언부 ]====================
    void Init(void);    // 
    함수 호출 함수


    int main()
    {


      Init();


      
    while(1);
      
    return 0;
    }


    void Init(void)
    {
      Init_LED();
      Init_AIC();
      
      
    return ;
    }

       

       

     

     

       

    < 실행 결과 동영상 참고 >

     

     


     

       

       

     

     

     

    궁금하신 점은 댓글로 남겨주세요 !!

     

    오늘도 좋은 하루 되세요 

     

     

     

     

     

     

     

     

     

     

     

       

    728x90
    반응형
상단으로