[Embedded] Communication Programming
STM32 에서 UART를 사용하려면 4가지 단계를 거쳐야 한다.
1. GPIO를 Alternate Function으로 Multiplexing
2. USART 모듈을 활성화하고 송수신 모드 설정
3. Baud Rate를 계산하고 BRR 레지스터에 작성
4. TXE 및 RXNE 플래그 기반으로 송수신

STM32F429xx 에는 USART 및 UART가 8개 들어있음.
두 개 모두 섞여있다. STM32는 동기 모드도 지원함.
APB1과 APB2는 속도가 다름. 각각 저속, 고속을 담당하고 USART1과 USART6은 빠른 버스에 붙어 baud rate가 높음.
STM32의 핀 하나는 기본 GPIO 외 16가지 Alternate Function 중 하나로 사용될 수 있음.
전에 다룬 USART CAN I2C 등 통신 모듈을 사용하려면 GPIO 핀을 해당 통신용 AF로 멀티플렉싱해서 통신 모듈에 빌려줘야 한다.
MODER - OTYPER - PUPDR - OSPEEDR - AFRL/AFRH 순서를 거쳐서 GPIO를 AF로 멀티플렉싱한다.
모든 모듈을 별도 핀에 할당하면 핀이 정말 많이 필요하니 핀 하나를 하나의 역할로 골라서 사용하는 전략을 사용.
지금은 GPIO로 쓰더라도 부팅 후에는 USART2_TX, 다른 보드에서는 SPI1_MOSI 이렇게 플젝마다 다르게 사용한다.

핀 안에는 MUX 회로가 들어있어 16개의 입력 중 하나를 고를 수 있음.
리셋 시 핀은 기본 GPIO 모드인 AF0로 설정된다.
USART 송신은 USART_DR에 데이터를 쓰면 알아서 하드웨어가 Shift Register로 옮기고 비트 단위로 Tx 핀에 토글한다.
상세 절차는 아래 그림과 같음 (순서대로 해야함)

데이터를 쓰면 하드웨어가 옮길 때 까지 기다려야 하는데. ABC 를 쓴다고 하자. A를 쓰고 언제 B를 써야 할까?
이걸 TXE비트 로 처리한다. (Transmit data register Empty)
TXE가 1이면 다음 걸 받을 수 있다는 뜻이고 TXE가 0이면 처리 중이라는 뜻.
그리고 완전히 끝났으면 TC비트를 사용한다. USART 끄기 직전에 TC 비트 1을 기다리고 Shift Register까지 비어있음을 확인함.
USART 수신은 송신을 거꾸로 하면 된다.
Rx 핀 -> Shift Register -> RDR -> USART_DR 읽기 순서대로 진행됨.
데이터가 도착하면 RXNE 비트가 1로 알려주고, 내가 읽으면 자동으로 0처리된다.
송신에서의 활성화 비트는 TE지만 수신에서의 활성화 비트는 RE를 사용하고
RXNEIE를 1로 설정하면 RXNE가 1로 될 때 인터럽트가 발생한다.
USART_SR 은 Status Register로 지금 USART가 어떤 상태인지를 나타낸다.
TXE TC RXNE ORE FE 등..
USART_CR1은 Control Register로 USART를 어떻게 동작시킬지를 나타낸다.
UE M TE RE 및 인터럽트 활성화 비트 등이 있음
USART_BRR 은 Baud Rate Register로 통신 속도를 어느정도로 정할지를 나타낸다.
Baud Rate는 USART 입력 Clock을 USARTDIV 값으로 나눈 값이다.
Mantissa + Fraction으로 BRR 레지스터에 저장되고, Mantissa만 쓰면 baud rate가 부정확해서 소수점 이하를 분할함.
STM32의 USART는 고정된 Clock 신호를 입력받지만 통신 상대는 9600bps같은 속도를 원한다.
그러니 고속 Clock을 나눠서 원하는 속도를 만드는 방식을 사용함.

OVER8 비트가 0이면 16배 오버샘플링이고 1이면 8배 오버샘플링을 적용한다.
'Computer Science > Embedded Software' 카테고리의 다른 글
| [Embedded] Motor (0) | 2026.05.13 |
|---|---|
| [Embedded] Sensor (0) | 2026.05.13 |
| [Embedded] Communication Protocol (1) (0) | 2026.05.12 |
| [Embedded] ARM Assembly (0) | 2026.05.10 |
| [Embedded] General Purpose Input Output (0) | 2026.04.30 |
댓글
이 글 공유하기
다른 글
-
[Embedded] Motor
[Embedded] Motor
2026.05.13 -
[Embedded] Sensor
[Embedded] Sensor
2026.05.13 -
[Embedded] Communication Protocol (1)
[Embedded] Communication Protocol (1)
2026.05.12 -
[Embedded] ARM Assembly
[Embedded] ARM Assembly
2026.05.10