newind2000 2015. 7. 29. 17:40

==================================Outline====================================

Interrupt

----------------------------------------------------------------------------

Interrupt

 

 

ARM은 전형적인 폰노이먼 구조를 띈다.

 

// PMC(Power Management Controller)

 

// AIC(Advanced Interrupt Controller)

 

Interrupt를 사용해 보자.




FIQIRQ보다 속도가 빠르다.

High-drive는 최대 16mA전류를 방출할 수 있다.

//나머지 핀들은 8mA이다.

 

총 핀들의 방출 전류의 합은 150mA를 넘을 수 없다.

 

ARM에서는 인터럽트 함수 이름을 사용자가 정의할 수 있다.

//ATmega는 인터럽트 함수 이름이 정의되어 있다.

 

C에서 함수 자체는 주소 값을 뜻함으로 interrupt의 주소에 사용자가 만든 함수를 넣으면 사용자가 작성한 함수가 호출되게 된다.

 

//ATmegaARM의 인터럽트 사용법이 다른 이유는 사용하는 core가 다르기 때문이다.

 

검출 모드 설정(트리거 설정)



 

FIQ가 가장 우선시 되고 PRIOR7이 우선순위이고 0으로 갈수록 우선순위가 낮아진다.

 

 

IRQID: Current Interrupt Identifier

The Interrupt Status Register returns the current interrupt source number.

 

PID 2번에 맞춰서 짜겠다.

 

PSUDO CODE란 인간이 인지할 수 있는 문장으로 어떠한 코드를 작성할 것인지 적어 놓은 것이다.


주어진 PSUDO CODE에 따른 코드는 다음과 같다.


#include "AIC.h"
#include "AT91SAM7S256.h"

void HANDLER(void)
{
  static volatile unsigned int uiIsr;
  volatile unsigned int uiCnt;

  if()
  {
  
  }

  for(uiCnt=01000000>uiCnt; ++uiCnt);

  return;  
}


void AIC_Init()  
{
  *PMC_PCER       = 1   <<   AT91C_ID_PIOA;   //전원공급(PIOA)활성화 - 데이터 시트 33PAGE
  *AT91C_PIOA_PER   = 1   <<   INT_PIN;      //핀 활성화 - 데이터 시트 248PAGE
  *AT91C_PIOA_ODR   = 1   <<   INT_PIN;       //핀 출력 비활성화
  *AT91C_PIOA_IDR   = 1   <<   INT_PIN;       //인터럽트 핀 비활성화
  *AT91C_PIOA_IFER   = 1  <<   INT_PIN;       //PIOA 입력 필터 활성화(잡음 제거 필터)

  *AT91C_AIC_IDCR  = 1  <<   AT91C_ID_PIOA;  //인터럽트 핀 커맨드 비 활성화
  *AT91C_AIC_ICCR  = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 클리어
  *AT91C_AIC_ISCR    = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 셋
  AT91C_AIC_SVR[AT91C_ID_PIOA] 
            =  (unsigned int)HANDLER;  //핸들러 등록 (7/29 여기까지)  
  
  return;
}




반응형