with-RL
로봇 / STM322024년 1월 20일

STM32 UART로 보드 제어하기

이번 과정은 UART 통신을 이용해 STM32 보드에 명령을 보내고 명령을 실행하는 기능을 구현하는 과정입니다.

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

1. 프로젝트 생성하기

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

3. printf를 UART로 출력하기 위한 설정

#include <stdio.h>
int __io_putchar(int ch)
{
     (void) HAL_UART_Transmit(&huart2, (uint8_t*) &ch, 1, 100);
     return ch;
}

4. 코드 작성 및 컴파일

uint8_t rx_data;
HAL_UART_Receive_IT(&huart2, &rx_data, 1);
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);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if (GPIO_Pin == BTN_Pin)
	{
		printf("Button Pressed\r\n");
	}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if (huart->Instance == USART2) {
		printf("Key Pressed: %c\r\n", rx_data);
		HAL_UART_Receive_IT(&huart2, &rx_data, 1);
	}
}

5. 다운로드 및 디버깅

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

6. '1'을 입력하면 LED가 켜지고 '2'를 입력하면 LED가 꺼지도록 수정

void print_cmd()
{
	printf("----------\r\n%s\r\n%s\r\n----------\r\nEnter Command:\r\n",
			"1: LED On",
			"2: LED Off");
}
print_cmd();
HAL_Delay(1000);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if (huart->Instance == USART2) {
		if (rx_data == '1')
		{
			printf("LED On execute\r\n");
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
		}
		else if (rx_data == '2')
		{
			printf("LED Off execute\r\n");
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
		}
		HAL_UART_Receive_IT(&huart2, &rx_data, 1);
		print_cmd();
	}
}