로봇/STM32

STM32 Button을 누르면 UART로 메시지 출력하기

with-RL 2023. 2. 28. 20:49

이번 과정은 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'라는 메시지가 출력되는 것을 확인할 수 있습니다.