STM32 - USART/UART

EEC·2025년 2월 21일

STM32

목록 보기
4/9

rev.2502211937 : 첫 작성.


이 포스팅에서는 USART에 대해서 알아보자.

USART(UART) 개념

USART(UART)는 장치 간 통신에 사용되는 직렬 통신 프로토콜이다.

USART : Univesal Synchronous/Asynchronous Receiver/Transmitter
UART : Univesal Asynchronous Receiver/Transmitter

위에서 보듯이,
USART와 UART는 Synchronous의 유무 차이다.
Synchronous가 무엇이냐?
직역하면 동기식인데, 통신을 할 때 클럭을 이용하냐 안하냐의 차이인 것이다.

즉, 클럭을 사용하면 USART라 부르고, 사용안하면 UART라고 한다.
클럭을 사용하게 되면 당연히 클럭을 전달할 BUS도 필요하기 때문에, Wire가 하나 더 필요하다.

반대로, 클럭이 없다면 데이터 통신의 기준이 없어진다.
내가 보내고자 하는 데이터를 어느 타이밍에 보낼지를 받는 쪽에서 모른다는 얘기다.
따라서, UART통신은 양쪽 장치 간에 이런 기준을 정해줘야 한다.(프로토콜)
Baud rate를 설정해야 하는 이유가 그거다.


직렬 통신이 무슨 뜻일까?
직렬 통신은 하나의 채널을 통해 하나의 데이터 포맷을 전부 통신한다.
반면에, 병렬 통신은 여러 채널을 통해 하나의 데이터 포맷을 전부 통신한다.

아래 그림을 보면, 직관적으로 이해할 수 있다.

직렬 통신 :

병렬 통신 :

위 두 그림 모두 똑같은 데이터를 주고 받은 통신이다. (01000011)

clock을 사용하는 동기식 통신 방식이고,
직렬 통신은 하나의 클럭 벌스에 한 비트씩, 병렬 통신은 데이터 전부를 통신한 것을 알 수 있다.

USART의 Parameters, registers

내 목적은 UART 통신으로 PC와 통신할 수 있도록 하는 것이 목표이다.
따라서, Mode는 Asynchronous로 하고 Basic Parameters들은 아래와 같이 설정해주겠다.

Baud Rate : 115200 Bits/s
Word Length(Data) : 8bits (including Parity)
Parity : None
Stop Bits : 1

Parity Bit는 오류 검출은 위한 데이터이다.
Stop Bit는 데이터 전송 완료 시 확인을 위한 데이터이다.

특별히 중요하거나 따로 공부해야할 Parameter는 없고, 저 설정을 기억했다가 통신할 장치의 설정도 똑같이 해주는 것이 중요하다.

Register도 특별히 유심히 봐야할 부분은 없는 듯하다.

실습

내 목적은 Board와 PC를 UART로 통신할 수 있도록 하고, 표준 입출력 함수인 printf() 함수를 통해 PC의 터미널 프로그램으로 데이터를 송신할 수 있도록 하는 것이다.

STM에서는 Test Board의 Peripheral 예제를 제공해준다.

C:\Users\사용자 이름\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.6\Projects\TEST Board 이름\Examples

경로에서 확인 할 수 있다.

printf() 사용을 위한 설정도 여기있다.

해당 code는 아래와 같다.

// printf.h

#ifndef INC_PRINTF_H_
#define INC_PRINTF_H_

#include <stdio.h>
#include "main.h"

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#endif /* INC_PRINTF_H_ */
// printf.c
#include "printf.h"

extern UART_HandleTypeDef huart2;

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

위 코드를 추가하면 printf() 함수를 쓸 수 있다.

이 방법에 대한 개념을 redirection이라고 하는데,
표준 입력과 표준 출력의 연결을 다른 쪽으로 변경할 수 있는 기능이다.

profile
느리지만 확실하게

0개의 댓글