STM32 EXTI(External Interrupt: 외부 인터럽트)

김상인·2025년 4월 25일

아직까지 자취방에 보드만 가지고 있어서, 오늘은 보드만으로 할 수 있는 외부인터럽트 실습을 해봤다. 책에선 큰 파트로 Peripheral이라고 표현했는데 우선 페리페럴이 무엇인지 알아보자.

페리페럴의 뜻은 '주변'이라고 나와있는데 임베디드에서는 주변장치를 가리키는 말이라 한다. 그래서 혼자 생각으로 주변장치의 범위가 어디까지 인가? 고민했는데, 책을 훑어봐서 외부 센서나 핀연결없이 실습하는 것을 보니 보드에 내장된 주변장치까지를 일컫는 듯 하다.
이 주변장치 중에서 사용자 버튼과 LED를 가지고 실습을 시작해보자.

프로젝트 생성은 이전과 같으니 생략하고 EXTI라는 이름으로 만들어줬다.
그러면 역시 CubeMX로 핀과 클럭 설정하는 화면이 나오는데 외부클럭을 사용할 일이 없기 때문에 HSE, LSE는 비활성화 시킨다.

그 다음 GPIO에서 목록을 보면 2가지 핀이 나오는데 각자 한번씩 클릭하면 해당 핀이 깜빡이면서 어느 부분인지 보여준다. 각 Blue Push Button, Green Led라고 친절히 나와있고, 우리는 버튼을 세팅해야하니 클릭해준다. 그러면 아래 설정창이 뜨는데 GPIO mode를 Rising edge에서 Falling edge로 변경해주자.

그 이유는 PC13핀과 연결된 버튼 회로도를 보면 알 수 있다. 잘따라가서 보면 버튼이 연결되어있는데 위쪽엔 VDD와 저항, 아래쪽엔 GND로 설계되어있다. 커패시터도 있어서 살짝 복잡해보이는데 플로팅 현상을 잡기위해 쓰는 풀업, 풀다운 저항 중 풀업저항 회로다. 풀업저항 특성상 스위치가 열려있으면 PC13에는 기본적으로 디지털값 1(High), 닫히면 0(Low)이 되기 때문에 우리는 버튼을 누르는(스위치를 닫는) 순간 인터럽트 발생시키기 위해 falling edge로 설정해주는 것이다.

그리고 NVIC에서는 인터럽트 우선순위, 시스템 관련 활성/비활성 등 인터럽트를 제어하는 항목이다. 인터럽트 제어기(Nested Vectored Interrupt Controller)라고 한다. 활성여부와 Code generation에서 인터럽트 생성 루틴 설정도 할 수 있다고 한다.

이렇게 핀 설정을 완료한 후, 클럭 설정에서도 내부 클럭만 사용하니 이전처럼 64MHz인지 확인해준다. 확인이 되었으면 Project > Generate Code로 코드를 생성해준다. stm32f1xx_it.c 내의 코드를 확인해보면 EXTI5_10_IRQHandler()라는 인터럽트 서비스 루틴 코드가 생성된 것을 확인할 수 있다. 내부에는 HAL_GPIO_EXTI_IRQHandler(B1_Pin);이 있는데 이 코드를 정의한 곳을 따라가보자.

stm32f1xx_hal_gpio.c 내부에 정의되어있고, 그안에도 Callback이라는 함수가 있는데 바로 아래가 해당되는 함수이다. 이것을 본 이유는 외부 인터럽트가 발생하면 함수 발생 순서가 EXTI5_10_IRQHandler() > HAL_GPIO_EXTI_IRQHandler() > HAL_GPIO_EXTI_Callback() 인 것을 알아보기 위한 것이다. __weak이라는 심볼이 콜백 앞에 존재하는데 이는 기본 구현이 되어있으나, 사용자 정의로 덮어쓸 수 있게 만든 심볼이라 한다. 만약 동일한 함수로 __weak 심볼없이 사용자 정의로 구현하면 기본 구현은 실행되지않고, __weak심볼이 없는 사용자가 정의한 함수대로 실행되는 것이다.

그래서 우리는 인터럽트에 대해 새롭게 코드를 main.c에 짜줄 것이다. 이 함수의 매개변수 GPIO_Pin이 사용자 버튼이면 LED를 Toggle시키는 코드로 짜준다.

이렇게 해서 직접확인하는 걸로 실습이 끝이나는데 솔직히 인터럽트인지 구분이 되지않아서, 개인적으로 main함수 내에 코드를 추가시켰다.

GPIO A포트에 5번핀이 해당 LED라는데 지금보니 매크로로 정해준 LD2~를 그대로 써줄걸 그랬다.
아무튼 이렇게 해서 버튼을 누르지 않으면 1초마다 깜빡이는 LED가 버튼을 누르면, 그 순간 바로 LED현상태에 반대로 Toggle시키는 것을 볼 수 있다.

profile
이것저것 해보기

0개의 댓글