본문 바로가기
코스웨어/14년 스마트컨트롤러

2014.07.14 일일보고서 번호8번 김진철

by 알 수 없는 사용자 2014. 7. 14.
728x90
반응형


*AT91C_AIC_ICCR=(1<<AT91C_ID_PIOA); // 기존의 인터럽트 신호를 초기화




*AT91C_PIOA_IFER=PIN_IRQ; // Glitch Filter  활성화

잡음의 펄스 또는 버스트. 논리 회로가 타이밍에서 벗어나는 것 등으로 본래 필요 없는 부분에 발생하는 펄스로서 오동작의 원인이 된다.

Glitch Filter는 이런 오동작의 원인이 되는 Glitch를 걸러내주는 Filter이다.


*AT91C_AIC_ISCR=(1<<AT91C_ID_PIOA); // 해당하는 인터럽트를 활성화(그룹 ON)

*AT91C_AIC_ICCR=(1<<AT91C_ID_PIOA); // 해당하는 인터럽트를 비활성화(그룹 OFF)



PIO_ISR 레지스터
어느 핀에 인터럽트가 걸려있는지 확인가능

PIO_IMR 레지스터
어느 핀에 인터럽트가 셋팅되어있는지 확인가능

PIO_ISR가 인터럽트 신호를 가지고 있지만 리드하는 순간 0으로 클리어되기에 이를 저장할 변수를 선언한다.

     static unsigned int uiStatus; // 인터럽트 신호를 저장할 변수 (static사용 이유는 속도 때문이다. 반환하는 시간을 줄이기 위해서)
     uiStatus=*AT91C_PIOA_ISR;


ARM 컴파일러는 함수의 인자 4개까지는 레지스터에 저장하고 그이후부터 스택에 저장한다.

ARM 컴파일러 종류
  1. IAR(유료)
  2. KEIL(유료)
  3. GCC(무료)



<소스코드 irq.c>


<소스코드 main.c>

#include <project.h>
#include <lcd.h>
#include <dbgu.h>
#include <irq.h>

int main(void)
{
  volatile unsigned int uiCnt;
  int cnt = 0;
  
  LCD_Init();
  IRQ_Init();
  IRQ_lED_Init();
  
  LCD_Str(" This is test.");


  while (1)
  {
    for(uiCnt = 0500000 > uiCnt; ++uiCnt);
    LCD_Inst(INST_SETDDRAM | 0x42);
    LCD_Data(('0'+(cnt%10)));
    ++cnt;
  }

  while (1);
  return 0;
}

<소스파일>



728x90