안녕하세요?
오늘은 EXIT(외부 인터럽트)를 사용을 하겠습니다.
Interrupt는 프로세스(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상항이 발생하여 처리가 필요한 경우 프로세서에게
알려 처리할 수 있도록 하는 기능입니다.
외부 인터럽트를 사용하기 위해 MUC핀을 눌러 GPIO_EXT를 설정합니다.
그 후에 GPIO에 들어가 GPIO모드에서 GPIO 설정을 해줍니다.
1) PD9를 외부 인터럽트로 지정을 하고 Rising edge와 Pull-down을 설정
(Rising Edge로 설정했기 때문에 신호가 LOW에서 HIGH로 변하는 순간에 인터럽트 발생)
2) 보드 내 스위치를 사용하기 위해 PC13과 LED제어를 하기위해 PB7를 GPIO 출력으로 설정
(NUCLEO보드에 연결된 스위치는 DataSheet를 참조하여 어느 핀에 연결되어 있는지 확인하는 것이 필요합니다.)
(외부인터럽트는 사용하는 핀이 연결되어 있기때문에 같은 인터럽트 핀을 사용할 수 없습니다. (예: 현재 인터럽트 PD9로 인터럽트를 사용하고 있으므로, PA9, PB9, PC9로 외부 인터럽트 설정 불가)
NVIC를 이용하여 인터럽트 설정을 하여 인터럽트 우선순위를 설정해야합니다.
코드를 생성하게 되면 왼쪽 같이 초기화함수가 작성이됩니다.
그러면 SetPriority로 인터럽트의 우선순위를 정하고 Enable를 통해 인터럽트를 사용할 수 있게됩니다.
3번째와 4번째 파라미터가 중요한데 위에 나와있는 글을 읽는것을 추천드립니다.
이해가 되지 않을분을 위해 간략히 설명하자면, 3번째 4번째 파라미터의 숫자가 낮아질수록 우선순위는 높아집니다.
여려개의 인터럽트가 걸리게 되면 3번째 파라미터를 비교하여 우선순위가 높은것부터 시행을 하며, 같을 경우 4번째 파라미터의 값을 비교하여 우선순위가 높은것을 먼저 시행합니다.
인터럽트가 발생하게 되면 인터럽트 핸들러가 호출이 되며, 인터럽트를 구분하기 위해 콜백함수를 호출합니다.
콜백함수를 그대로 가져와 Main문에 작성을 한 후에 사용하면 되겠습니다.
먼저 Main문을 통해 처음에는 7번핀에 연결된 LED가 켜져있는것을 볼 수 있습니다.
그다음 인터럽트가 걸리게 되면 g_led_on_off변수가 1로 변경이 되어 led가 꺼졌다가 켜졌다를 반복하는것을 확인할 수 있습니다.
감사합니다.