이번 과정은 Button이 눌렸을 때 Interrupt를 발행하고 이때 메시지를 UART 통신을 이용해 출력하도록 하는 기능을 구현하는 과정입니다.
아래 과정은 아래 환경과 보드를 이용했습니다.
- Windows 11 Home
- STM32CubeIDE-1.11.2
- STM32 NUCLEO-F103RB 보드
1. 프로젝트 생성하기
- STM32 프로젝트를 생성합니다.
- 다음과 같이 동작하는 프로그램을 작성하도록 하겠습니다.
◦ 사용자는 Button (PC13)을 누릅니다.
◦ 이때 Interrupt가 발생합니다.
◦ Interrupt Cabllback에서 UART_TX (PA2)로 메시지를 전송합니다.
◦ Teraterm과 같은 터미널에서 메시지를 확인합니다.
2. 핀 설정 및 소스코드 생성하기
- UART 통신을 하기 위해서 'Connectivity' > 'USART2'에서 아래와 같이 설정합니다.
◦ Mode: Asynchronous
◦ 'Parameter Settings' > 'Basic Parameters' > 'Baud Rate': 9600
- 'System Core' > 'GPIO' > 'PA5' 핀의 User Label을 'LED'로 변경합니다.
LED는 STM32 보드의 동작을 표시하는 용도로 주기적으로 깜빡이도록 할 예정입니다.
- 버튼에 해당하는 'PC13' 핀을 'GPIO_EXTI13'으로 설정합니다. (기본값)
- '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' 버튼을 눌러서 코드를 생성합니다.
3. 코드 작성 및 컴파일
- main.c 함수에 아래와 같이 주기적으로 LED가 깜빡이도록 구현합니다.
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // LED On
HAL_Delay(500);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); // LED Off
HAL_Delay(500);
- main.c 함수에 아래와 같이 HAL_GPIO_EXTI_Callback 함수를 정의하고 Interrupt 발생 시 uart 포트를 통해서 메시지를 전송하도록 합니다.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == BTN_Pin)
{
uint8_t str[] = "Button Pressed\r\n";
HAL_UART_Transmit(&huart2, str, sizeof(str), 100);
}
}
- 툴바에서 'Build Debug' 버튼을 눌러서 컴파일 실행합니다.
4. 다운로드 및 디버깅
- 컴파일된 이미지를 다운로드하고 테스트합니다.
아래 그림과 같이 STM32 보드의 파란색 버튼을 누를 때마다 'Button Pressed'라는 메시지가 출력되는 것을 확인할 수 있습니다.
'로봇 > STM32' 카테고리의 다른 글
STM32 자동차 제어하기(1) - 기본환경 설정 (0) | 2023.03.19 |
---|---|
STM32 UART로 보드 제어하기 (1) | 2023.03.01 |
STM32 Button Interrupt를 이용한 LED 제어 (0) | 2023.02.28 |
STM32 Button을 이용해서 LED 깜빡이기 (0) | 2023.02.22 |
STM32 LED 깜빡이기 (NUCLEO-F103RB) (0) | 2023.02.21 |