인터럽트를 이용한 LED Control

아래 포스트에서 GPIO Input 포트를 폴링하여 Led를 제어했다면 이번 포스트는 PA0 Pin를 인터럽트로 설정하여 Led를 제어하려고 한다.

 

GPIO Input을 이용한 LED Control

STM32F407G 데모보드는 2개의 버튼을 가지고 있으며, PA0 Pin을 GPIO Input으로 설정하여 Blue 버튼을 입력하게 되면, PA0 High로 변경되며 이때 LED를 켜지도록 할 예정이다. 아래 회로도를 참고하기 바란다.

memories.tistory.com

PA0 Pin을 인터럽트로 설정하려면 CubeIDE에서 아래와 같이 Pin 타입을 GPIO_EXTI0로 설정하도록 한다. 그리고 NVIC 항목에서 EXTI line0를 활성화 시키도록 한다.

위 상태로 ioc 파일을 저장하면 GPIO 초기화 코드에서 아래 코드와 같이 인터럽트 관련 초기화 코드가 생성된 것을 확인할 수 있다.

그리고 stm32f4xx_it.c 파일을 살펴보면, 아래 코드와 같이 인터럽트 핸들러가 추가된 것을 확인할 수 있다. 만약 NVIC 항목에서 EXTI line0 interrupt를 활성화 하지 않았다면, 아래 코드는 생성되지 않았을 것이다.

/* @brief This function handles EXTI line0 interrupt.*/
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

HAL_GPIO_EXIT_IRQHandler 함수를 확인해보면 아래 코드와 같이 HAL API(stm32f4xx_hal_gpio.c)에서 인터럽트에 대한 처리를 구현한다. 하지만 주석에 있는 것처럼 HAL 코드에서 인터럽트 코드를 작성하는 것이 아닌 작업하는 코드에서 weak function을 구현하도록 한다.

그리고 이전 포스트에서 GPIO Input Pin를 Polling 하면서 LED를 제어했지만, 인터럽트 방식은 상태 변환가 발생했을 때만 인터럽트가 발생하기 때문에 Blue 버튼이 눌렸을 때 LED가 On 시키지 않고, 아래코드와 같이 Blue 버튼이 입력되면 LED 출력을 On/Off 시키는 방식으로 변경하였다. stm32f4xx_it.c 파일에 인터럽트 핸들러 코드를 작성하였다.

/* @brief This function handles EXTI line0 interrupt.*/
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_0)
	{
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);
	}
}