[Cortex-M3] 3. EXTI(외부 인터럽트)와 AFIO, NVIC

2019. 9. 2. 16:18개발 관련 학습정리/ARM(cortex-m3) Register 분석

반응형

 

EXTI(외부 인터럽트)가 일어나는 과정과 내부 아키텍처에 대해 알아보자.

외부에서 input이 들어오면 다음과 같은 처리를 하여 이루어진다.

1. falling trigger와 rising trigger를 거쳐 인터럽트를 검출한다

2. 마스크 레지스터와 and논리회로를 거쳐 enable 상태일때 통과시킨다.

3. pending 레지스터를 거쳐 nvic컨트롤러로 향한다.

인터럽트는 0~15번까지 존재하며 16~19번 인터럽트는 특수한 인터럽트이다.

 

 

 

간단한 구조를 알아보았으니 제어를 하기 위하여 레지스터를 알아보자.

GPIO는 항상 쓰이기 때문에 확실히 외워두고 알아보는게 좋을 듯 하다.

 

 

 

 

 

 

 

1. EXTI_RTSR (Rising Trigger Selection Register)

 

TRx : 해당 인터럽트를 rising trigger로 설정한다.

EXRI_FTSR도 마찬가지로 구조가 같으며 해당 비트를 falling trigger로 설정한다.

 

 

 

 

 

 

 

 

2. EXTI_IMR (Interrupt Mask Register)

 

MRx : 해당 인터럽트를 enable시키는 역할을 한다.

인터럽트를 설정할때 꼭 필요한 마스크 레지스터이다.

 

 

 

 

 

 

 

 

3. EXTI_PR (Pending Register)

PRx : 해당 인터럽트의 처리를 진행하는 pending 비트이다.

해당 비트를 통하여 인터럽트를 구분할 수 있는 역할을 한다.

 

 

 

 

 

다음은 AFIO를 통하여 해당 인터럽트의 핀을 바꾸어주는 레지스터들을 알아보자.

4. AFIO_EXTICRx (External interrupt configuration Register x)

EXTICRx는 한 레지스터당 4개의 인터럽트를 담당하고 있으며,

총 4개로 이루어져있다. 4개의 비트를 통하여 a핀부터 g핀까지 설정할 수 있다.

참고

 

 

 

 

 

 

 

 

 

코어 peripherals인 NVIC를 제어하여 인터럽트를 조정해보자.

5. NVIC_ISERx (Interrupt Set-Enable Register)

ISER은 3개가 존재하며, 80개의 비트로 이루어져 있다.

인터럽트 테이블을 보고 해당 비트를 1로 세트해 주면 테이블에 해당하는 기능을 enable할수있다.

 

 

 

 

 

 

 

총 순서는,

1. RCC로 GPIO 클락 제공

2. GPIO 설정

3. EXTI의 모드 설정

4. AFIO 설정

5. 마지막으로 NVIC를 켜주면 된다.

 

 

 

 

 

 

 

간단히 순서도 이해할 겸 예제소스를 알아보자.

	/*-------------------input:a5,a6 output:b7,c8-----------------------------*/
	*(volatile unsigned int*)0x40021018 |= 0x1D; 	// RCC->APB2ENR = gpioa/b/c 
	*(volatile unsigned int*)0x40010800 = (0x04 << 20); 	// GPIOA->CRL gpioa.6mode = input
	*(volatile unsigned int*)0x40010C00 |= (0x04 << 20); 	// GPIOA->CRL gpioa.6mode = input
	*(volatile unsigned int*)0x40011004 = (0x03); 	// GPIOB->CRH gpioc.8mode = output
	*(volatile unsigned int*)0x40010C00 |= (0x03 << 28); 	// GPIOB->CRH gpiob.7mode = output
	/*------------------GPIO----------------------*/
	
	*(volatile unsigned int*)0x4001040C = 0x60; //EXTI->FTSR
	*(volatile unsigned int*)0x40010400 = 0x60; //EXTI->IMR
	
	/*------------------EXTI----------------------*/
	*(volatile unsigned int*)0x4001000C = 0x100; //EAFIO->EXTICR[1](2)
	
	*(volatile unsigned int*)0xE000E100 = (0x08 << 20); //NVIC->ISER[0].23
ARM으로 배우는 임베디드 리눅스 시스템:CPU에서 안드로이드까지 총망라, 한빛미디어

 

반응형