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;
}
전체 코드
출처:
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 |
댓글