Microprocessor/ARM7 ARM7 자료 ( 인터럽트, 타이머, LED 응용 / ARM 전원공급 ) [20120725]
  • 728x90
    반응형

       

       

       

      안녕하세요 L입니다.

     

    오늘은 ARM7 전원공급에 대해 정리하였습니다.

     

    그리고 지금까지 사용해본 AIC, Timer, LED 종합하여 실습해 보았습니다.

     

    레귤레이터 LM1117-3.3 스팩PDF 파일은 첨부파일에 있음돠 !!

     

     

    LM1117-3.3datasheet.pdf


     

     

     

     

     

     ARM7

       

       

    엣지,하이,로우 -> AIC -> handler ( 인터럽트가 있을경우 ) -> 함수 ( C에서

    -> IRQ 함수 ( 인터럽트 리퀘스트 )

       

       

    ARM 32 pin 모두 인터럽트로 사용할 있다.

       

    ATmega 8개의 외부 인터럽트를 사용할 있다.

       

       

       

    [ USB ]

       

       

       

       

    4개의 납땜다리 = 도면의S1 ~ S4

       

    5개의 선 = 도면 1~5번

       

     S1~S4 : Ground

       

     1 = VBUS

     3 = DDP

    ㆍ 2 = DDM

     5 = Ground

     

     C4, C5 : 잡음을 없애는 역할

       

       

       

       

       

       

    [ 스위치 ]

       

       

       

       

     1 = VBUS

       

     2 = VCC5

       

     3 = EVCC

       

       

       

    [ 전원공급 ]

     USB 1 :: POWER 2(VCC5)

       

       

       

       

     

       

    < 도면의 J4 >

       

     

     J4 = 2pin 몰렉스

       

     

    몰렉스를 통해서도 전원공급이 가능하다

       

     

    V에 ( + )전력 :: G에 ( - )전력을 연결.

       

       

     

       

    [ 레귤레이터 (Regulator) ]

       

     

     

       

    레귤레이터란?

    전압 조절기 (레귤레이터 : Regulator) 는 파워 서플라이로 공급되는 전압을 다운시켜 메인 보드로 공급하는 장치

       

     

     

       

    < LM1117-3.3 >

       

       

       

       

     

     

    굵은선은 전력공급선을 나타낸다.

       

     

    3.3볼트 Pin에 연결되어 있다.

       

     

    얇은선은 신호선을 나타낸다.

       

       

     

     

       

     

    ADJ 들어오는 전압에따라 유동성있게 변환하여 사용할 수 있다.

       

       

       

       

       

     

     

       

    Ex) 인터럽트가 들어왔을 타이머가 작동하여 1초후 LED 켜고 / 끄기.

       

       

    헤더파일 이전 포스팅 참고

       

       

     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 (인터럽트)

    #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_SVR2 = (
    unsigned int)AIC_IRQ_Timer_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_Timer_Led(void)
    {
      
    volatile unsigned int dly;
      

    if((1<<IRQ_Pin)==PIO_ISR)
      {

        TC_CCR = 1
     << CLKEN;    // 
    타이머 클럭 활성화 
        TC_CCR = 1 << SWTRG;    // 
    타이머 start !! 
      }


      
    for(dly = 0;200000 > dly; dly++);
      PIO_ISR;      // 
    이레지스터는 사용후 스스로 자신을 지운다.
      AIC_EOICR = 0;    // End of Interrupt 
      
    return ;
    }

       

       

       

       

    Ex) 타이머

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

    void Init_timer(void)
    {
      PMC_PCER = 1 << TC0;
      TC_CCR   = 1 << CLKDIS;    // Counter Clock Disable Command

      TC_IDR   = (1 << COVFS)| (1 << LOVRS)| (1 << CPAS)| (1 << CPBS)| (1 << CPCS)| 
               (1 << LDRAS)| (1 << LDRBS )| (1 << ETRGS);
      TC_SR;  
      TC_CMR   = (TIMER_CLOCK5 << TCCLKS) | (1 << CPCTRG);

      TC_RC    = 49152;    

      AIC_IDCR = 1 << TC0;

      AIC_SVR[TC0] = (
    unsigned int)timer_AIC_handler;
      AIC_SMR[TC0] = (AIC_SRCTYPE_INT_HIGH_LEVEL << SRCTYPE) |
                   (AIC_PRIOR_LOWEST <<PRIOR);
      AIC_ICCR  = 1 << TC0;

      TC_IER = 1 << CPCS;
      AIC_IECR = 1 << TC0;

    /*  
    인터럽트에 사용하기 위해 주석 */  
    //  TC_CCR = 1 << CLKEN;    // 
    타이머 클럭 활성화 
    //  TC_CCR = 1 << SWTRG;    // 
    타이머
     start !! 

      
      
    return ;
    }


    void timer_AIC_handler(void)
    {
      TC_CCR   = 1 << CLKDIS;    // Counter Clock Disable Command 
      TC_SR;  
      LED_toggle();
      TC_SR;
      
      
    return ;
    }

       

       

       

     메인함수와 함수 호출

    #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();
      Init_timer();
      
      
    return ;
    }

       

       

     

     

       

    < 실행 결과 동영상 참고 >

       


       

     

       

       

       

       

     

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

     

    오늘도 좋은하루 되세요 

     

     

     

     

       

       

       

    728x90
    반응형
상단으로