EXIT (External interrupt)

유명현·2021년 6월 12일
0

안녕하세요?

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

인터럽트란?

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개의 댓글

관련 채용 정보