본문 바로가기
Embedded/STM32

[STM32] 외부 인터럽트(EXTI : EXTernal Interrupt)를 통해 버튼의 입력 감지

by Gordon_ 2025. 4. 6.

- 개발 환경

개발 보드 : NUCLEO-F103RB

개발 프로그램

- STM32 CubeMX : 6.12.0

- STM32 CubeIDE : 1.16.0


1. 서론

  인터럽트를 사용하기 전 사전적 정의부터 확인해보는 것이 좋습니다.

출처 : 네이버 사전

  사전적 정의에서도 알 수 있듯이 "방해하다, 중단시키다 등"의 의미를 가지고 있습니다. MCU 관점에서의 인터럽트는 프로그램의 실행 흐름(STM32에서는 main 함수)을 방해 및 중단하고 급하게 처리해야 할 작업(Task)를 의미합니다. 

인터럽트 처리에 대한 대략적인 순서

  인터럽트를 처리하는 것을 보면 마치 운영체제가 프로세스를 스케쥴링하는 것과 비슷하게 보이지만 반드시 주의 해야할 사항들이 있습니다. 

- 주의 사항

  • 기존 프로그램의 흐름의 영향이 가지 않도록 빠른 시간내 처리를 완료해야한다.
    중요) HAL_Delay 및 입출력 중 바쁜 대기(Blocking)를 동작을 하여서는 안됩니다.
  • 인터럽트을 많이 사용한다면, 각 인터럽트간 우선순위를 확인해야 합니다.

2. 프로젝트 생성

  STM32 CubeIDE를 사용하셔도 상관없으며, 저의 경우는 VS code를 사용하여 개발할 것이므로 VS code로 개발하시고 싶은 분은 아래 포스트를 참고 하셔서 프로젝트를 생성해주시면 됩니다.

https://littlebitodd-developer.tistory.com/8

 

STM32위한 vscode 개발 환경 구축

STM32을 개발하기 위해서 STmicronics 회사에서 제공하는 "STM32 CubeIDE"를 사용하였습니다. 하지만, 기존 Visual studio code를 자주 사용하는 저에게 있어 Eclipse 기반의 STM32 CubeIDE는 사용하기 매우 불편하

littlebitodd-developer.tistory.com

3. GPIO 외부 인터럽트의 주의사항

같은 숫자의 핀들은 같은 Interrupt로 묶여 있음을 확인

  GPIO 인터럽트의 경우 위 그림에서 확인할 수 있듯이 숫자가 같은 Pin은 하나의 Interrupt로 묶여 있습니다. 그 의미는 같은 숫자를 가지는 Pin은 동시에 사용할 수 없다는 뜻입니다. (PA0 핀과 PG0은 동시에 인터럽트 설정을 할 수 없다.) 실제로 STM32CubeMX에서 동시에 설정하려고 하면 이전에 설정한 인터럽트가 자동적으로 해제 됩니다.

자동적으로 PA9이 설정 해제됨

 

4. 인터럽트 설정을 위한 IOC 파일 수정

  저희는 보드에서 기본적으로 제공하는 버튼을 사용할 예정입니다. IOC에서 이미 설정되어 있지만, 설정 방법을 확인해보도록하겠습니다. 먼저 Button이 연결된 PC13핀을 클릭하고 GPIO_EXTI13를 클릭합니다.

 

다음으로 인터럽트를 Falling Edge로 설정합니다.

PC13의 인터럽트를 Falling edge로 설정

 

Rising edge는 전압이 LOW에서 HIGH로 변하는 순간을 말합니다. 

Rising edge 발생

 

Falling edge는 전압이 HIGH에서 LOW로 변하는 순간을 말합니다.

Falling edge 발생

 

우리는 버튼이 눌리는 순간 인터럽트를 발생 시킬 것이므로 Falling edge로 설정합니다.

 

마지막으로 EXTI 인터럽트를 활성화합니다.

5. 실습 코드 작성

버튼을 클릭할 때마다 LED가 점등하는 실습 코드를 작성하도록 하겠습니다.

보드에 탑재된 LED(PA5)는 자동적으로 IOC파일에 적용되어 있어 수정할 필요가 없습니다.

LED가 연결된 PA5가 Output으로 설정된 IOC

5.1. 인터럽트 Callback 함수 작성

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  // 인터럽트가 발생한 핀을 확인
  if (GPIO_Pin == GPIO_PIN_13)
  {
    // LED가 연결된 PA5 핀을 토글글
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  }
}
/* USER CODE END 4 */

 

main.c 파일의 221 번째 줄에 있는 USER CODE BEGIN4 안에 Callback 함수를 작성하였습니다.

 

이제 빌드후 실행하면 정상 작동합니다.

 

6. 문제점

  하지만 몇가지 문제점이 있습니다. 보드에 있는 버튼의 퀄리티가 좋지 않은지 채터링(또는 Bouncing) 현상이 일어납니다. 채터링 현상은 버튼을 누르거나 땔때 물리적으로 두개의 접점이 떨리면서 노이즈가 발생하는 것을 말합니다. 해당 채터링을 방지하기 위한 하드웨어적인 조치 및 소프트웨어적인 조치가 있지만 해당 내용은 나중에 포스트를 올리도록 하겠습니다.