1: /*********************************************************
2:
3: 제 목: 외부핀(PA7) 인터럽트 받아 PA0번에 연결된,
4: LED ON/OFF 토글하기
5:
6: *********************************************************/
7:
8: #include "PIOA.h"
9:
10: /*********************************************************
11: PMC (AT91SAM7S256)
12: *********************************************************/
13: #define PMC_PCER (*(volatile unsigned int *)0xFFFFFC10) //주변장치 클록 허용 Reg.
14:
15: /*********************************************************
16: AIC (AT91SAM7S256)
17: *********************************************************/
18: #define AIC_IECR (*(volatile unsigned int *)0xFFFFF120) //인터럽트 허용 명령
19: #define AIC_IDCR (*(volatile unsigned int *)0xFFFFF124) //인터럽트 금지 명령
20: #define AIC_ISCR (*(volatile unsigned int *)0xFFFFF12C) //인터럽트 세트 명령
21: #define AIC_ICCR (*(volatile unsigned int *)0xFFFFF128) //인터럽트 클리어 명령
22: #define AIC_SMR ((volatile unsigned int *)0xFFFFF000) //32개이니 시작주소 array
23: #define AIC_SVR ((volatile unsigned int *)0xFFFFF080) //32개이니 시작주소 array
24: #define AIC_EOICR (*(volatile unsigned int*)0xFFFFF130) //인터럽트 종료 명령 레지스터
25: #define PIOA 2 //PIOA PID
26: #define INT_PIN 7 //7번핀으로 인터럽트를 받음. 이 MCU는 모든 핀으로 인터럽트를 받을 수 잇음.
27: #define SRCTYPE 5 //검출 모드
28: #define PRIOR 0 //우선 순위
29: #define LED 0 //0번 핀에 LED연결
30:
31: void Interrupt_INIT(); //9월 1일 추가
32: void HANDLER(); //인터럽트 서비스 루틴
33: void LED_INIT(); //LED가 연결된 포트 초기화
34:
35: int main(void)
36: {
37: LED_INIT(); //LED를 사용하겠다.
38: Interrupt_INIT(); //외부핀 인터럽트를 받겠다.
39:
40: while(1); //return되면 안됨. 돌아갈 곳이 없어. 집이 없어.
41:
42: return 0;
43: }
44:
45: void HANDLER(void) //인터럽트 신호 들어온 장치 ID 찾는 함수
46: {
47: static volatile unsigned int isr; //여기서 값 대입하면 static변수라 한번만 사용하게 됨!!
48: volatile unsigned int cnt;
49:
50: isr=PIOA_ISR; //신호 들오온 장치 번호 저장
51: //(한번 읽으면 레지스터내용은 지워지므로 변수에 저장)
52:
53: if(0 != ((1<<INT_PIN) & isr)) //7번 비트 & 읽어온 번호 , 7번에 들어오면 1
54: {
55: if(0 != ((1 << LED) & PIOA_ODSR)) //LED가 꺼져 있으면
56: { //LED를 킨다.
57: PIOA_CODR = (1 << LED);
58: }
59: else //LED가 켜져 있으면
60: { //LED를 끈다.
61: PIOA_SODR = (1 << LED);
62: }
63: }
64: for(cnt=0;1000000>cnt;cnt++); //약 0.5초의 딜레이
65: isr=PIOA_ISR; //왜 또 저장하지? 인터럽트 상태를 지우기 위해?
66:
67: AIC_EOICR=0; //인터럽트 서비스루틴이 종료하다고 적음.
68:
69: return ;
70: }
71:
72: void LED_INIT()
73: {
74: PIOA_PER = (1 << LED); //포트사용
75: PIOA_OER = (1 << LED); //출력 활성
76: PIOA_PPUDR = (1 << LED); //풀업 없앰
77: PIOA_SODR = (1 << LED); //LED Off
78:
79: return ;
80: }
81:
82: void Interrupt_INIT()
83: {
84: PMC_PCER = (1 << PIOA); //PID2 = PIOA에
85: PIOA_ODR = (1 << INT_PIN); //7번핀 입력을 받기 위해 출력 비활성화
86: PIOA_PER = (1 << INT_PIN); //7번핀 포트를 사용함.
87:
88: PIOA_IDR = (1 << INT_PIN); //PIOA 인터럽트 비활성.
89: AIC_IDCR = (1 << PIOA); //인터럽트 설정하는 도중 인터럽트가 걸리면 안되.
90:
91: AIC_SVR[PIOA] = (unsigned int)HANDLER; //SVR[] (배열의 값)은 unsigned int형
92: AIC_SMR[PIOA] = (2 << SRCTYPE) |(0 << PRIOR); //상승에지, 우선순위 최하
93:
94: AIC_ICCR = (1 << PIOA); //에지 검출기 클리어
95: PIOA_IFER = (1 << INT_PIN); //글리치 필터 적용.
96: AIC_ISCR = (1 << PIOA); //에지 검출기를 세트한다.
97:
98: PIOA_IER = (1 << INT_PIN); //인터럽트 허용.
99: AIC_IECR = (1 << PIOA); //PIOA장치 인터럽트 허용.
100:
101: return ;
102: }
103: