Embedded/1. STM32, Arduino

STM32 - EXTI (External Interrupt 외부 인터럽트) 이론

잇(IT) 2024. 5. 25. 12:37

Interrupt(인터럽트)

 

인터럽트란 다른 동작을 수행하기 위해 주는 신호를 뜻한다.

 

일반적으로 Interrupt를 사용하지 않고 신호를 전달하면 (Polling) 실행되고 있던 동작을 완전히 끝낸 후에 새로 받은 신호에 따라 동작을 수행한다.

Interrupt를 사용하면 Interrupt가 발생하자마자 수행하고 있는 동작을 잠시 중지하고 Interrupt로 발생된 동작을 수행하고 원래 수행하던 동작을 수행한다.


EXTI(External Interrupt)

 

EXTI는 말 그대로 외부에서 발생하는 Interrupt를 의미한다. 스위치를 눌러 수행하는 동작의 경우 EXTI라고 할 수 있다.

STM32의 경우 위와 같은 알고리즘을 따른다.

 

1. Input Line을 통해 인터럽트가 발생하면 Rising 혹은 Falling을 감지하여  OR gate를 통해 신호를 전달한다.

2. Software interrupt event, Rising, Falling trigger selection register의 신호를 OR gate로 전달하고, 전달된 신호는 Interrupt mask register와 AND gate로 신호가 전달된다.

3. Interrupt mask register의 경우

 신호가 1인 경우 not masked 즉, 마스킹되지 않았다는 것을 의미하며 마스킹되지 않았다는 것은 인터럽트를 활성화 하겠다는 의미다.

 

4. AND 게이트를 통해 1, 1신호가 전달되었다는 것은 => 인터럽트가 활성화되어있고(1), 인터럽트가 발생했다(1)는 것을 의미한다. 

5. Pending request register는 주로 인터럽트 요청이나 다른 형태의 비동기적 이벤트를 추적하게 되는데 AND 게이트로부터 1의 신호가 오게 되면 내부 인터럽트가 발생했다는 것을 의미하기 때문에 NVIC interrupt controller로 인터럽트가 발생했다는 신호를 전달하게 된다.

 

* NVIC는 인터럽트 요구 사항을 효율적으로 처리하기 위해 사용되는 컨트롤러다.


STM32의 EXTI는 보는것과 같이 GPIOA~GPIOK의 0~15핀을 각각 EXTI 0~15번까지 사용한다.

그 외

EXTI 16 : PVD(Programmable Voltage Detector) 출력에 연결

EXTI 17 : RTC(Real Time Clock) 알람에 연결
EXTI 18 : USB OTG FS 웨이크업(Wakeup) 이벤트에 연결
EXTI 19 : Ethernet Wakeup 이벤트에 연결
EXTI 20 : USB OTG HS (configured in FS) Wakeup 이벤트에 연결
EXTI 21 : RTC Tamper와 TimeStamp 이벤트에 연결
EXTI 22 : RTC Wakeup 이벤트에 연결

에 사용된다.


EXTI로 사용할 핀을 GPIO_EXTI로 설정한다.

 

NVIC 설정

위와 같이 각 Pin에 대해 10~15 Pin의 경우 하나로 나머지 0~9번핀은 각각 하나의 Enabled로 설정할 수 있다.

EXTI 관련된 Code 생성을 위해 Code generation에서도 EXTI와 관련된 Pin을 설정해준다.

 

GPIO 설정

NVIC 설정이 끝난 뒤 GPIO 설정을 한다.

 

GPIO mode 

GPIO mode를 보게되면 Rising edge, Falling edge, Rising Falling edge 등 어떤 동작에서 인터럽트를 발생 시킬 것인지 정할 수 있다.

만약 Rising edge trigger detection을 설정한다면 0 -> 1로 신호가 변할 때 인터럽트를 발생시키게 된다.

 

code를 생성하면 좌측의 src 파일에 _it.c 파일이 생성되고 해당 파일은 인터럽트와 관련된 c 파일이다.

EXTI를 설정한 3번 PIN에 대한 함수가 생성되어 있는 것을 확인 할 수 있다.

위 함수에서 호출되고 있는 HAL_GPIO_EXTI_IRQHandler() 함수의 경우 GPIO에서 발생하는 EXTI 인터럽트 처리를 위한 인터럽트 핸들러 함수에 해당한다.  위 함수는 또 HAL_GPIO_EXTI_Callback() 함수를 호출하고 있다.

Callback 함수의 경우 weak 처리가 되어 있기 때문에 다른 곳에서 재정의될 수 있다는 것을 의미하며, 결과적으로 Callback함수는 다른곳에서 인터럽트 발생시 실행 시킬 함수라는 것을 알 수 있다.


main.c 파일을 보게되면 MX_NVIC_Init 초기화 함수가 생성된 것을 확인할 수 있다.

 

HAL_NVIC_setPriority() 함수의 경우 첫번째 파라미터의 인터럽트 라인의 우선순위를 설정한다. 두번째 파라미터는 우선순위 그룹을 의미하고, 세번째 파라미터는 서브 우선순위를 의미한다.

 

HAL_NVIC_EnableIRQ() 함수의 경우 파라미터의 인터럽트를 활성화하고 이 명령이 실행되면 인터럽트 라인에서 발생하는 인터럽트가 처리될 수 있다.

 

728x90