ex02.3_SW_int - withrobot/myCortex-STM32F4 GitHub Wiki

개요

SW_int 예제는 STM32 MCU의 GPIO 입력 인터럽트를 사용하는 예를 보여주기 위해 스위치 입력을 인터럽트로 받아 처리하는 예제를 만든 것입니다. 본 예제를 실행하기 위해서는 Switch 드라이버에서 안내하는 바와 같이 별도의 스위치 회로를 구성해야 합니다.

관련 Peripheral

관련 Driver

소스 살펴보기

main.c 파일 하나로 구성되어 있습니다. ex02.2_SW 예제와 다른 부분만 살펴보도록 하겠습니다.

15 line:

SW_INT_INIT();

스위치 관련 페리페럴들을 초기화하고 인터럽트 설정을 하는 함수를 호출합니다. 스위치 인터럽트를 사용하기 위해 최초 한번 초기화가 이루어져야 합니다.

19 line:

__WFI();

WFI는 Wait For Interrupt 입니다. 즉 이 함수를 만나면 MCU에서 아무 인터럽트가 발생할 때 가지 저전력 대기상태로 멈춰있습니다.

24 line: // SW1 : PA0(EXTI0) Interrupt Handler void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(SW_1_EXTI_LINE) != RESET) { LED_R_TOGGLE(); EXTI_ClearITPendingBit(SW_1_EXTI_LINE); } } PA0핀에서 발생하는 인터럽트를 처리하는 핸들러 함수입니다. PA0핀에 인터럽트는 EXTI0_IRQHandler()로 들어옵니다. PB0, PC0, PD0 등도 역시 이 핸들러에서 처리됩니다. 즉 모든 포트의 0번 핀을 위한 공용 인터럽트 핸들러입니다. 이처럼 공용으로 사용하는 인터럽트 핸들러에서는 실제 인터럽트가 발생한 핀이 정말 PA0인지, 아니면 PB0나 PC0인지 확인하고 그에 따라 다른 동작을 하게 됩니다. 하지만 이 예제에서는 EXTI0에 연결한 인터럽트 소스는 PA0 밖에 없으므로 별도의 확인 코드는 넣지 않았습니다.

이 핸들러에서는 적색 LED를 반전시키고 인터럽트 상태를 초기화해 줍니다. 인터럽트 상태를 초기화 해 주지 않으면 인터럽트가 계속해서 발생하게 됩니다.

34 line: // SW2 : PB10(EXTI10) Interrupt Handler void EXTI15_10_IRQHandler(void) { if (EXTI_GetITStatus(SW_2_EXTI_LINE) != RESET) { LED_G_TOGGLE(); EXTI_ClearITPendingBit(SW_2_EXTI_LINE); } } PA0를 위한 인터럽트 핸들러는 EXTI0_IRQHandler()이지만 PB10 즉 10번 핀을 위한 인터럽트 핸들러는 EXTI15_10_IRQHandler()입니다. 이 함수는 10~15번 핀 공용으로 사용합니다. 핸들러 내부에서 처리하는 로직은 동일합니다.

실행 방법

프로젝트를 빌드해서 다운로드 합니다. Switch 드라이버에서 설명한 바와 같이 스위치 회로를 구성합니다.

PA0에 연결된 스위치를 한번 누를 때 마다 적색 LED가 토글되는 것을 확인합니다. PB10에 연결된 스위치와 녹색 LED도 동일하게 동작합니다.