EXIT (External interrupt)

유명현·2021년 6월 12일

안녕하세요?

오늘은 외부 인터럽트에 대해 공부해 볼려고 합니다.

인터럽트란?

Interrupt는 프로세스(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상항이 발생하여 처리가 필요한 경우 프로세서에게 알려 처리할 수 있도록 하는 기능입니다.

<인터럽트 처리 루틴>

위에 있는 그림을 보면 인터럽트 처리 루틴을 보실 수 있습니다.

프로그램 실행 중에 인터럽트 요청 신호를 검사합니다.

인터럽트 처리 신호를 감지하게 되면 현재 PC와 SR을 저장하고 (인터럽트 처리 루틴을 완료하고 돌아오기 위해서) 그 다음 인터럽트 처리를 합니다.

인터럽트 처리를 한 후에 원래 프로그램 상태로 돌아오기 위해 PC와 SR을 참조하여 원래 프로그램을 재실행 합니다.

<STUM32CubeMX로 초기 설정>

현재 사용하는 보드는 NUCLEO070RB보드를 사용하고 있으며 데이터시트를 참조하면 PC13이 스위치 연결이 되어 있음을 알 수 있습니다.

스위치 모듈이 없기 때문에 보드에 있는 스위치를 사용하여 외부인터럽트를 제어히기 위해 PC13을 GPIO_OUPUT으로 설정을 했고 PD9는 PC13과 연결하여 외부인터럽트를 제어하기 위해 설정을 했습니다.
또한, ISR루틴에 LED를 제어하기 위해 PB7를 GPIO_OUTPUT으로 설정합니다.

<Trigger siganls 이란>

위에 인터럽트를 Rising Edge를 설정하였는데 인터럽트 신호가 LOW레벨에서 HIGH레벨로 변하는 순간을 감지하여 인터럽트를 발생시킵니다.
감지는 Rising, Falling, Rising and Falling으로 설정할 수 있습니다.

<인터럽트 핀 사용에 유의할 점>

인터럽트 핀은 위에 있는 그림처럼 연결되어 있기 때문에 여러 포트에 같은 숫자의 핀을 사용하지 못합니다.
(예 : PA0과 PB0을 같이 인터럽트 사용하지 못함. 최대 0 ~15까지 16개의 외부 인터럽트 설정 가능)

<STM32CubeMX 설정한 외부인터럽트 초기화 함수>

위에 그림을 보게 되면 STM32CubeMX로 설정한 초기화함수가 작성된 것을 볼 수 있습니다.
HAL_NVIC_SerPriority를 이용하여 인터럽트의 우선순위를 설정할 수 있습니다.
여러 인터럽트가 동시에 울리게 되면 인터럽트를 처리하기 위한 우선순위가 필요합니다.
HAL_NVIC_SerPriority에 있는 3번째, 4번째 파라미터를 이용하여 인터럽트 우선순위를 정합니다.
PreemptPriority은 0~15까지 입력할 수 있으며, 더 낮은 숫자가 인터럽트 우선순위가 높습니다.
만약 PreemptPriority가 같다면 SubPriority의 값을 비교하여 우선순위를 정하며, SubPriority도 0 ~ 15까지 입력이 가능합니다.

<인터럽트 처리를 위한 함수 확인>

IAR에서 Stm_32g0xx_it.c파일에 가보면 현재 설정한 인터럽트 핸들러 함수를 볼 수 있습니다.
함수에 오른쪽 커서를 누르고 함수가 정의된 곳을 가면, 콜백 함수를 호출하고 있고 이 콜백 함수를 이용하여 사용자가 원하는 인터럽트 처리 함수를 만듭니다.

<인터럽트 처리>

위에 봤던 인터럽트 콜백함수를 가져와 콜백함수 안에 내용만 작성하시면 됩니다.
콜백함수안에 g_led_on_off를 1로 만들어 인터럽트가 걸리게 되면 B7에 연결된 LED를 ON/OFF 동작을 하게 만들었습니다.
인터럽트 처리가 않는 경우는 PB7은 항상 LED가 켜져있습니다.

profile
기억보다 기록을

0개의 댓글