Embedded/STM32

STM32 시리즈 UART 이론 학습 - Nucleo-G071RB (STM32F 차이점)

변화의 물결1 2025. 2. 18. 00:06

 

 

안녕하세요.

 

  이번에는 UART 이론 내용을 다뤄 보겠습니다. 그런데 기존의 레지스터와 조금 변경된 내용이 있어 같이 내용을 추가해 보았습니다. STM32 시리즈마다 다를 수 있으므로, 평가보드나 사용하고 있는 MCU의 DataSheet는 꼭 확인해 보시기 바랍니다.

 

 


 

1. UART (Universal Asynchronous Receiver/Transmitter)란?

 

1) 설 명

 

 UART는 직렬 통신(Serial Communication) 방식 중 하나로, 데이터를 비동기 방식(Asynchronous)으로 송수신하는 하드웨어 모듈입니다.

 즉, 데이터를 1비트씩 순차적으로 보내는 방식이며, 클럭 신호 없이 송신기와 수신기가 같은 전송 속도를 유지해야 합니다.

 

 

2) UART의 특징

 

 - 비동기 방식 (클럭 신호 없이 송수신)

 - Start Bit + 데이터 + Stop Bit 형태로 데이터 전송

 - TX (Transmit, 송신) & RX (Receive, 수신) 두 개의 라인 사용

 - 일반적인 전송 속도 (Baud Rate): 9600, 115200 등

 

 

3) UART의 데이터 프레임 구조

 

 UART 데이터는 보통 아래와 같은 구조로 전송됩니다.

 

Start Bit(1bit) 데이터 (5~9bit) 패리티 비트(옵션) Stop Bit (1~2bit)

 

 - Start Bit (1비트): 항상 0 (LOW)로 시작

 - 데이터 (5~9비트): 실제 전송할 데이터

 - 패리티 비트 (옵션, 1비트): 오류 검출용

 - Stop Bit (1~2비트): 전송 종료를 나타내며 1 (HIGH) 유지

 

 중요) 데이터를 주고받을 때 반드시 송신 쪽과 수신 쪽의 Baud Rate(전송 속도) 설정을 맞춰야 합니다.

 

 

4) UART와 RS-232, TTL

 

 UART와 RS-232를 혼용해서 사용할 때가 있습니다. 큰 조금 차이를 본다면 UART은 통신 프로토콜이고, RS-232와 TTL은 전기적 신호 방식입니다.

 하드웨어적인 이야기를 할 때는 232 혹은 TTL로 구분해서 알려주면 실수하지 않을 것입니다. 그러나 통신방식을 이야기할 때는 크게 UART라고 하면 포괄하는 의미라고 생각하면 됩니다.

 

  

 

2. USART란? (Universal Synchronous/Asynchronous Receiver/Transmitter)

 

1) 설 명

 

 USART는 UART의 확장된 버전으로, 동기 모드 (Synchronous Mode)는 클럭 신호(SCK)를 추가 사용합니다.

 즉, USART는 UART의 기능을 포함하면서, 추가적으로 동기 통신(Synchronous)도 가능한 인터페이스입니다. 

 

 

2) USART (동기 모드)에서 동작 방식

 

 SCK (Serial Clock) 핀이 추가되었습니다. 송신기(TX)가 SCK 신호를 발생시키고, 수신기(RX)는 이 클럭을 따라가면서 데이터를 읽습니다.

 Start/Stop Bit 없이 일정한 속도로 데이터를 송수신 가능합니다.

 

 

3) 동기 방식의 장점과 단점

 

 (1) 장점

 

 - 더 빠른 데이터 전송 가능 (클럭 기반이므로 Baud Rate 문제 최소화)

 - Start/Stop Bit 필요 없음 (연속 전송 가능)

 - CPU 부담 감소 (클럭을 기준으로 정해진 타이밍에 데이터 처리)

 

 (2) 단점

 

 - 추가적인 클럭 신호(SCK)가 필요 → 핀 수가 하나 더 필요함

 - 마스터-슬레이브 방식 → 한쪽이 클럭을 생성해야 함

 

 

3. UART 신호선

 

 기본적으로 단방향 통신이며, 기본 4핀을 사용하며 전원이 인가된 보드일 경우 VCC는 필요하지 않습니다. 그래서 주로 3핀을 사용합니다.

 

 TXD (Transmit Data) : 송신 데이터 라인으로, UART 장치에서 데이터를 다른 장치로 보내는 데 사용됩니다. 상대 쪽의 RXD핀과 연결합니다.

 

 RXD (Receive Data) : 수신 데이터 라인으로, 다른 장치에서 데이터를 수신하는 데 사용됩니다.

 보내는 쪽의 TXD핀과 연결합니다.

 

 GND(Ground) : 모든 장치가 동일한 기준 전위를 공유하도록 GND선을 연결합니다. 그리고 잡음과 외부간섭 신호로부터 보호하는 역할도 합니다. 이를 통해 UART 통신의 신뢰성을 높일 수 있습니다.

 

 

 

4.  STM32 USART block diagram

 

 내부 블록 구조를 볼 수 있으며, 우리는 실제로 레지스터(USART_BRR, CR 등)를 통해 제어할 수 있습니다. 그리고 외부와 연결하는 TX, RX, CTS, RTS 등의 핀 연결을 확인할 수 있습니다. 제품 시리즈에 따라 블록도가 조금 다를 수 있습니다.

 

기존 송수신핀 외에 통신흐름제어를 위한 핀이 있습니다.

 

 RTS (Request to Send) : 이 핀은 송신 준비가 되었음을 수신 장치에 알리는 신호입니다. 송신 장치는 수신 장치가 데이터를 받을 준비가 되었는지 확인한 후 데이터를 보냅니다.

 보통 흐름 제어(flow control)에 사용됩니다.

 

 CTS (Clear to Send) : 이 핀은 수신 장치가 데이터를 받을 준비가 되었음을 송신 장치에 알리는 신호입니다. RTS와 함께 사용되며, 송신 장치가 CTS 신호를 확인한 후에 데이터를 보냅니다.

 마찬가지로 흐름 제어에 사용됩니다.

 

CK (Clock) : 동기식 통신에서 사용하는 신호로, 송신 장치와 수신 장치 간의 데이터를 전송하는 데 사용되는 클럭 신호를 제공합니다.

  CK 핀을 사용하여 두 장치가 동일한 클럭 신호를 공유함으로써 정확한 타이밍으로 데이터를 주고받을 수 있습니다. 비동기식 통신에서는 사용하지 않습니다.

 

<STM32F4>

 

 

 

<STM32G0>

 

 

 

5. 레지스터

 

1) Status 레지스터

 

 USART_SR(USART_ISR)은 UART의 통신상태를 알려주는 레지스터입니다. 제품 시리즈에 따라서 SR 혹은 ISR로 사용합니다. STM32G0은 USART_ISR로 사용합니다.

 

주요하게 봐야 할 비트는

RXNE(Read Data Register Not Empty)/RXFNE(RXFIFO not empty)로 수신데이터 레지스터의 상태를 알려줍니다. 1이면 수신 준비가 됨, 0이면 수신 준비가 안 됨입니다.

 

TC(Transmission Complete)는 송신이 완료되었음을 나타냅니다.

TXE(Transmit Data Register Empty)/ TXFNF(TXFIFO not full)는 송신 데이터 레지스터가 비어 있음을 나타냅니다. 1이면 데이터가 비어 있음을 나타냅니다.

 

<USART_SR>

 

 

 

<USART_ISR>

 

 

 

2) Data 레지스터

 

 USART_DR는 송수신 데이터를 직접 저장하는 레지스터입니다. 송신(Tx) 핀과 수신(Rx) 핀이 별도로 되어 있지만, 한 레지스터에서 처리하며 총 9비트(DR[8:0])를 사용합니다.

 

 

 

 최신 ARM Cortex-M 기반의 설계 가이드라인에 맞춰서 STM32G0 시리즈에서는 USART_RDR(Receive Data Register)과 USART_TDR(Transmit Data Register)로 분리되었습니다.

 

 

3) Baud Rate 레지스터

 

 USART_BRR은 통신 속도인 Baudrate를 설정하는 레지스터입니다.

 

 STM32F4 시리즈 경우 USART_BRR은 Mantissa(정수 부분) + Fraction(소수 부분) 두 부분으로 나뉘어 있습니다. STM32G0에서는 이 개념이 사라지고, 단순히 USART_BRR 값을 바로 계산하면 됩니다.

 

 예를 들어 목표 Baud Rate = 115200 하고, PCLK (USART 클럭) = 16 MHz이라면

STM32F4 시리즈는

 

uint32_t usartdiv = 16000000 / 115200; // 138.88
uint32_t mantissa = usartdiv / 16; // 8
uint32_t fraction = usartdiv % 16; // 10
USART1->BRR = (mantissa << 4) | fraction; // 0x08A

 

 

 

STM32G0 시리즈는

 

USART1->BRR = (256 * 16000000) / 115200; // 결과: 0x8AAB (35556)

 

로 간단하고 좀 더 정밀하게 설정 가능합니다.

 

 

 

4) Control 레지스터

 

 USART_CRx는 통신 제어를 위한 레지스터로 제공하는 USART 수만큼 구성되어 있습니다. 통신의 시작, 마침 인터럽트 Enable, Disable 등의 기능이 있습니다.

 

 STM32F4와 STM32G0을 CR 레지스터에서 핵심 기능은 유지되고 일부 불필요한 비트는 삭제되었습니다. 예로, 오버샘플링 비트가 변화와 M0, M1 비트로 데이터 길이 설정 등이 있습니다.

 

 

<STM32F4 시리즈>

 

 

<STM32G0 시리즈>

 

 

 

 이것으로 간단하게나마 USART 설명을 마무리합니다. 기존 레지스터에 변화가 있고, 이로 인해 알아야 할 것이 더 많아지는 것 같습니다. UART를 작동하기 위한 기존 레지스터와 새로운 레지스터를 함께 확인했다고 생각하면 좋지 않을까 합니다.

 

 

감사합니다.

 

 

<참고 자료>

1. 임베디드 컨트롤러 기초 5차시 - STEP 교육과정

2. RM0444 Reference manual(STM32G0)

3. RM0383 Reference manual(STM32F4)

 

 

STM32F411_Reference Manual.pdf
11.36MB
stm32g0_Reference Manual.pdf
16.63MB

반응형