본문 바로가기
공부,일/Arm

외부 인터럽트 POI & AIC

by fromnothing1 2021. 10. 10.

AIC

 

 

(p-34)

A peripheral identifier is required for the control of the peripheral
interrupt with the Advanced Interrupt Controller and for the control of the peripheral clock
with the Power Management Controller. 

->peripheral identifier 와 AIC_SVR 번호가 호환 되어 있다. 

 

 

ex) 17번 핀에 negative edge 를 가할 때 마다 16 번 핀이 toggle 되는 코드

#include <AT91SAM7S256.h>
#include <PinInOut.h>

void HANDLER(void);
void AIC_Init();
volatile unsigned int flag = 0;

#define INT_PIN 17

// 외부 인터럽트 설정 
void AIC_Init()
{
	*AT91C_PMC_PCER = 1 << AT91C_ID_PIOA;		// PIOA다리를 활성화  33p.
	*AT91C_PIOA_ODR = 1 << INT_PIN;			// 핀 출력 비활성화
	*AT91C_PIOA_PER = 1 << INT_PIN;			// PIOA 15번다리를 활성화
	*AT91C_PIOA_IDR = 1 << INT_PIN;			// 인터럽트 핀 비 활성화
	*AT91C_AIC_IDCR = 1 << AT91C_ID_PIOA;		// 인터럽트 핀 커맨드 비 활성화 175p.

	AT91C_AIC_SVR[AT91C_ID_PIOA] = (volatile unsigned int)HANDLER;	// 핸들러 등록
	//*AT91C_PIOA_PPUER = 1 << INT_PIN;           // pull up  on
	*AT91C_PIOA_PPUDR = 1 << INT_PIN;                  // pull up off  
	AT91C_AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_LOWEST;// 동작모드 및 우선순위 결정
	*AT91C_AIC_ICCR = 1 << AT91C_ID_PIOA;		// 커맨드 레지스터 클리어
	*AT91C_PIOA_IFER = 1 << INT_PIN;			// PIOA 입력 필터 활성화
	*AT91C_AIC_ISCR = 1 << AT91C_ID_PIOA;		// 커맨드 레지스터 셋
	*AT91C_PIOA_IER = 1 << INT_PIN;   // PIOA 인터럽트 핀 인터럽트 활성화
	*AT91C_AIC_IECR = 1 << AT91C_ID_PIOA;		// AIC 인터럽트 핀 인터럽트 활성화
	return;
}


void HANDLER(void)
{

	// PIO 의 어느 핀에서 인터럽트가 발생했는지 PIO_ISR 레지스터를 통해서 찾는다. 
	static volatile unsigned int uiPin_state; 
	volatile unsigned int iCnt; 
	uiPin_state = (*AT91C_PIOA_ISR);

	if (0 != (uiPin_state&(1<<INT_PIN)))
	{
		if (0 == flag)
		{
			Led_OFF(16);
			flag = 1;
		}
		else if (1 == flag)
		{
			Led_ON(16);
			flag = 0;
		}
	}

	for (iCnt = 0; iCnt < 1000000; ++iCnt); // 너무 길게 한거 같긴함

	uiPin_state = *AT91C_PIOA_ISR; // 한번더 넣으면 인터럽트값이 0으로 바뀐다
	*AT91C_AIC_EOICR = 0; // 인터럽트가 완료됨을 나타내고 종료숫자로 0을 준다.
	return;
}

int main(void)
{
	//volatile unsigned int iCount = 0;

	Led_INIT_PULLUP(16);
	AIC_Init();
	while (1) 
	{
	};
	return 0;
}

 

전체 코드

AIC_external.zip
0.04MB

출처: 

https://wowcat.tistory.com/1382

 

2013.05.20_[타이머카운터복습/인터럽트/풀업풀다운저항]_김성엽

▶ Timer/Counter ( 복습!! ) : CPU가 시간을 재는것 AT91SAM7S256에는 16비트 타이머/카운러채널 (TC0~TC2)를 가지고 있습니다. 이들 3개의 채널은 서로 독립적으로 동작하며 이벤트카운트, 주파수 측정, 시간

wowcat.tistory.com

 

'공부,일 > Arm' 카테고리의 다른 글

gcc 컴파일 옵션  (0) 2021.11.16
내가 만든 라이브러리 포함함시키기  (0) 2021.10.11
jtag 사용하기  (0) 2021.10.05
GPIO 다루기  (0) 2021.09.06
pwm 실습  (0) 2021.09.06

댓글