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가 꺼지는 것을 확인할 수 있습니다.
'로봇 > STM32' 카테고리의 다른 글
STM32 UART로 보드 제어하기 (1) | 2023.03.01 |
---|---|
STM32 Button을 누르면 UART로 메시지 출력하기 (2) | 2023.02.28 |
STM32 Button을 이용해서 LED 깜빡이기 (0) | 2023.02.22 |
STM32 LED 깜빡이기 (NUCLEO-F103RB) (0) | 2023.02.21 |
STM32 개발환경 설정하기 (0) | 2023.02.21 |