S3C6410 베어 메탈 - 외부 인터럽트

6232 단어
1. 외부 인터럽트 그룹:
외부 인터럽트 그룹 0 GROUP0 GPN0-GPN15 GPL8--GPL14 GPM0-GPM4
외부 인터럽트 그룹 1 GROUP1 GPA0-GPA7 GPB0-GPB6
외부 인터럽트 그룹 2 GROUP2 GPC0--GPC7
외부 인터럽트 그룹 3 GROUP3 GPD0 - GPD5
외부 인터럽트 그룹 4 GROUP4 GPF0 - GPF14
외부 인터럽트 그룹 5 GROUP5 GPG0-GPG7
외부 인터럽트 그룹 6 GROUP6 GPH0 - GPH9
외부 인터럽트 그룹 7 GROUP7 GPO0-GPO15
외부 인터럽트 그룹 8 GROUP8 GPP0 - GPP14
외부 인터럽트 그룹 9 GROUP9 GPQ0 - GPQ9
2. 중단 그룹의 중단 번호:
NO 인터럽트 소스 설명 GROUP
0      INT_EINT0 외부 인터럽트 그룹 0 bit[0-3] VIC0
1      INT_EINT1 외부 인터럽트 그룹 0 bit [4-11] VIC0
32    INT_EINT2 외부 인터럽트 그룹 0 bit[12-19] VIC1
33    INT_EINT3 외부 인터럽트 그룹 0 bit[20-27] VIC1
53    INT_EINT4 외부 브레이크 그룹 1-9 VIC1
3. 프로그램 설정을 중단한다.
1. 해당하는 GPIO 입구를 외부 인터럽트 모드로 설정한다.
사용된 레지스터: GPxCON
1     //  GPN0 GPN1
2     GPNCON &=~(3 << 0);
3     GPNCON &=~(3 << 2);
4     
5     //GPN0 GPN1       
6     GPNCON |= (1 << 1);
7     GPNCON |= (1 << 3);

 
2. 외부 인터럽트와 관련된 설정 레지스터 설정;
사용된 레지스터: EINT0CONx(인터럽트 트리거 구성)
EINT0MASK(인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트 인터럽트)
PRIORITY(브레이크 우선 순위 구성)
1     //EINT0,1     
2     EINT0CON0 &=~(7 << 0);
3     EINT0CON0 |= (2 << 0);
4     
5     //      
6     EINT0MASK &=~(1 << 0);
7     EINT0MASK &=~(1 << 1);

 
3. 에너지 중단 소스 요청
사용된 레지스터: VICxINTENABLE
1     //       
2     VIC0INTENABLE |= (1 << 0);

 
4. 벡터 주소 구성
사용한 레지스터: VIC0VECTADDRx (서비스 중단 함수의 주소를 벡터 주소 레지스터에 쓰기)
1     //      
2     VIC0VECTADDR0 = (int)IRQ_Handle_Exit;

 
5. 벡터 인터럽트 허용(6410은 비벡터 인터럽트와 벡터 인터럽트를 지원합니다. 210은 벡터 인터럽트만 지원합니다. 이 절차는 필요 없습니다.)
사용된 레지스터: 협동 프로세서 CP15의 C1 제어 레지스터(bit24)
6, 에너지 IRQ 중단(총 중단)
사용된 레지스터: 프로그램 상태 레지스터 CPSR
 1     __asm__(
 2         //      
 3         "mrc p15, 0, r0, c1, c0, 0
" 4 "orr r0, r0, #(1 << 24)
" 5 "mcr p15, 0, r0, c1, c0, 0
" 6 // RIQ 7 "mrs r0, cpsr
" 8 "bic r0, r0, #(1 << 7)
" 9 "msr cpsr_c, r0
" 10 : 11 : 12 );

 
7. 인터럽트 서비스 프로그램 작성
현장을 보호하다
프로그램 중단
인터럽트 플래그 지우기
EINT0PEND 중단 플래그 지우기(쓰기 1 지우기)
VICxADDRESS 벡터 주소 지우기
복구 현장
 1 void IRQ_Handle_Exit(void)
 2 {
 3     //    
 4     __asm__(
 5         "sub lr, lr, #4
" 6 "stmfd sp!, {r0-r12, lr}
" 7 : 8 : 9 ); 10 11 // 12 if(EINT0PEND & (1 << 0)) //EINT0 13 { 14 led_all_on(); 15 } 16 else if(EINT0PEND & (1 << 1)) //EINT1 17 { 18 led_all_off(); 19 } 20 21 // 22 EINT0PEND = 0xFFFFFFFF; 23 VIC0ADDRESS = 0x00000000; 24 25 // 26 __asm__( 27 "ldmfd sp!, {r0-r12, pc}^
" 28 : 29 : 30 ); 31 }

 
8. 부팅 코드 설정
IRQ 스택 설정
 1 //start.S
 2 init_stack:
 3     //   IRQ SP
 4     msr cpsr_c, #0xd2
 5     ldr sp, =0x53000000
 6 
 7     //   SVC SP
 8     msr cpsr_c, #0xd3
 9     ldr sp, =0x54000000
10     mov pc ,lr

좋은 웹페이지 즐겨찾기