로봇/STM32

STM32 Button Interrupt를 이용한 LED 제어

with-RL 2023. 2. 28. 19:53

STM32 Button을 이용해서 LED 깜빡이기 과정에서는 while 문 안에서 Button의 상태를 확인하고 상태에 따라서 LED를 켜거나 끄도록 했습니다. 이번에는 Button이 눌렸을 때 Interrupt를 발행하고 이때 LED를 제어하도록 구현하는 과정입니다.

아래 과정은 아래 환경과 보드를 이용했습니다.

  • Windows 11 Home
  • STM32CubeIDE-1.11.2
  • STM32 NUCLEO-F103RB 보드

1. 프로젝트 생성하기

  • STM32 LED 깜빡이기 (NUCLEO-F103RB)의 '1. 프로젝트 생성하기'와 동일한 방법으로 STM32 프로젝트를 생성합니다.
    단, 프로젝트 이름만 기존과 다르게 입력합니다.

2. 핀 설정 및 소스코드 생성하기

  • 버튼에 해당하는 'PC13' 핀을 'GPIO_EXTI13'으로 설정합니다. (기본값) 

  • 'System Core' > 'GPIO' > 'PA5' 핀의 User Label을 'LED'로 변경합니다.

  • 'System Core' > 'GPIO' > 'PC13' 핀의 값을 아래와 같이 변경합니다.
    ◦ GPIO mode: 'External Interrupt Mode with Rising edge trigger detection'
    ◦ GPIO Pull-up/Pull-down: 'No pull-up and no pull-down'
    ◦ User Label: 'BTN'

  • 'System Core' > 'GPIO' > 'NVIC'에서 'Exit line[15:10] interrupts'의 'Enabled'를 선택합니다.

  • 'System Core' > 'NVIC' > 'NVIC'에서'Exit line[15:10] interrupts'의 'Enabled'를 선택합니다.

  • 'Ctrl + S' 또는 'Code Generation' 버튼을 눌러서 코드를 생성합니다.

  • 아래와 같이 main.h코드가 생성된 것을 확인할 수 있습니다.

  • 아래와 같이 stm32f1xx_it.c 파일에 IRQ (Interrupt Request) 관련 코드가 생성된 것을 확인할 수 있습니다.

  • 아래와 같이 stm32f1xx_hal_gpio.c 파일에 HAL_GPIO_EXTI_Callback 함수는 __weak로 정의되어 있기 때문에 이 함수를 main.c 에 재 선언해서 구현해서 interrupt를 처리할 수 있습니다.

3. 코드 작성 및 컴파일

  • main.c 함수에 아래와 같이 HAL_GPIO_EXTI_Callback 함수를 구합니다.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == BTN_Pin)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);  // LED 모드 변경
	}
}

  • 툴바에서 'Build Debug' 버튼을 눌러서 컴파일 실행합니다.

4. 다운로드 및 디버깅

  • 컴파일된 이미지를 다운로드하고 테스트합니다.

  • 아래 그림과 같이 버튼을 누르면 LED가 켜지고 한번 더 누르면 LED가 꺼지는 것을 확인할 수 있습니다.