06. HAL 입문기1 , UART 송신 구현

owljun·2025년 7월 31일
post-thumbnail

목표

MCU ---- UART Tx ----> PC(Desktop) ----> 메시지 확인
PC ---- UART Tx ----> MCU UART Rx ----> 에코백


개발 환경 세팅

S/W 준비물

STM32CubeIDE 설치는 이전 포스트에서 다루었기 때문에 스킵한다.

  • Putty 다운로드

https://www.putty.org/

  • UART 메시지 수신을 확인하기위하여 Putty 를 사용한다.

H/W 준비물

  • STM32 MCU (본 포스팅에서 진행한 보드는 STM32 Nucleo-F103RB 보드이다.)
    • STM32 MCU 보드만 있다면 진행에 무리는 없다. (단, BlueFill 모델일 시 , ST-Link 및 UART 통신 케이블 별도 필요할 수 있음)
    • PC의 USB 포트와 STLink를 연결해주자.
  • Desktop PC (Windows)

시작

Putty 세팅

  • Putty 실행 후 Serial 선택 , Win + X 키 -> 장치관리자 -> 포트에서 연결된 ST*... 포트번호확인, (여기서 필자는 COM5였다.)
  • BaudRate (Speed) 맞춰주기(STM보드의 스피드로)

  • 좌측 메뉴 Serial -> Flow control None 설정 및 나머지 STM보드와 맞춰주기.
  • Flow control이 설정되어있다면, 통신이 안 될수 있으니 유의하자.


Open 클릭하여 터미널 열기, (예제 출력 화면)

STM32CubeIDE


File -> new -> STM32 Project


본인이 사용하는 모델명 찾아서 선택 후 Finish, 프로젝트명 삽입 후 Finish , 뜨는 알림창은 모두 Yes 클릭

  • 프로젝트명.ioc 파일 더블클릭 , 여기서 사용중인 STM32 모델에 따라 그림이 달라진다.
  • Nucleo-f103rb 모델을 사용중이라면 그대로 따라하고, 아니라면 웹서칭을 이용하자.

  • 좌측의 Connectivity -> USART2 활성화 (이미 되있다면 스킵)

  • USART2 더블클릭 -> NVIC Settings -> 인터럽트 체크
  • Parameter Settings -> Baud Rate 등 값 설정
  • Ctrl + S 눌러 저장하면 Generate Code ? 알림창 뜰 것, -> Yes (이는 CubeMX가 제공하는 기능으로 세팅값에 맞춰 코드를 생성해준다.)

  • 이후 Project Explorer 에 보면 Core -> Src -> main.c 라는 파일이 생성되어있다. main.c 오픈
  • 장황한 주석이 달린 코드가 보일 것이다. 이는 C언어와 동일하니 겁먹지 말자.
  • 기본 코드를 유지하되, HAL 사용을 위해 필요한 코드만 삽입할 것이다.

  • UART 통신에 사용할 구조체 핸들을 정의한다. (CubeMX 자동생성)
UART_HandleTypeDef huart1; 	// USART1
UART_HandleTypeDef huart2;	// USART2
  • 송 수신에 활용할 버퍼를 정의한다.
uint8_t RxData[1];
char TxBuffer[50];
  • UART 관련 초기화 함수 선언 (CubeMX 자동생성)
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);

  • 수신 완료시 실행될 콜백 함수를 정의한다.
  • 위 코드는 수신 완료 후에 실행된다는 점을 유의하자.
  • 실행 흐름은 다음과 같다.
    • HAL_UART_Transmit(&huart2, RxData, 1, 100)
    • UART2 를 통해 수신한 RxData 1비트를 송신한다, TTL은 100ms로 설정한다.
    • HAL_UART_Receive_IT(&huart2, RxData, 1)
    • UART2의 RxData 버퍼로 1비트 수신을 대기하겠다.
  • 이 코드는 에코기능을 담당한다.
  • 아래로 내리다보면 프로그램의 메인루프가 있다.
  • 여기 sprintf 함수를 통해 버퍼에 문자열을 할당하고, 송신한다.
  • 코드작성이 완료되면 망치모양 아이콘을 클릭해 빌드하고, 문제가없다면 Run을 통해 플래시해주자.
  • Putty로 잘 동작하는지 확인이 가능하다.

마치며

이번 글에서는 STM32 Nucleo-F103RB 보드를 활용하여 PC와의 UART 통신을 성공적으로 구현해 보았습니다. 간단한 메시지를 주기적으로 송신하고, PC로부터 데이터를 수신하여 다시 에코백(Echo back)하는 기능을 통해 UART 통신의 기본 원리와 HAL 라이브러리 사용법을 익혀보았습니다.

특히, 가상 COM 포트를 이용한 손쉬운 PC 연결부터 STM32CubeIDE를 활용한 프로젝트 설정, 그리고 HAL 라이브러리 함수(HAL_UART_Transmit, HAL_UART_Receive_IT, HAL_UART_RxCpltCallback)를 이용한 인터럽트 기반 통신 구현까지, 실질적인 개발 과정을 경험할 수 있었습니다. 초기 설정에서 흐름 제어(Flow Control)와 NVIC 인터럽트 활성화 같은 세부 설정의 중요성도 다시 한번 깨달았습니다.

UART 통신은 임베디드 시스템에서 가장 기본적이면서도 핵심적인 통신 방식 중 하나입니다. 이번 경험을 발판 삼아 다음번에는 SPI, I2C, CAN 등 다양한 통신 프로토콜을 활용하여 더욱 복잡하고 흥미로운 프로젝트를 구현해 볼 예정입니다.

이 게시글이 STM32 UART 통신을 시작하려는 분들께 유용한 길잡이가 되기를 바랍니다. 궁금한 점이나 개선할 부분이 있다면 피드백 환영합니다~!

profile
Embedded S/W Developer :)

0개의 댓글