[MCU] UART 통신 데이터 오실로스코프 검증 - kenGwon/FirmwareProgramming_Lecture GitHub Wiki

직렬(serial)통신과 병렬(parallel)통신

직렬 통신은 1개의 통신라인만을 이용하여 **1클럭당 1개의 데이터(1비트)**를 전송한다. 병렬 통신은 여러개의 통신라인을 이용하여 **1클럭당 여러개의 데이터(주로 8비트 또는 16비트)**를 전송한다.

두 장치(PC, MCU, 각종 전자기기 등)가 멀리 떨어져있을 때 서로 데이터를 송수신 할때는 직렬 통신을 사용하는 것이 일반적이다. 그런데 MCU의 경우 프로세서 내부에서 데이터 버스는 병렬 통신 방식을 사용하므로 외부의 장치와 직렬 통신으로 데이터를 주고받기 위해 "송신 시에는 병렬 데이터를 직렬 데이터로, 수신 시에는 직렬 데이터를 병렬 데이터로 변환해줄 필요성"이 발생한다.

UART(Universal Asynchronous Receiver/Transmitter: 범용 비동기 송수신기)

UART는 데이터를 직렬로, 또는 병렬로 변환시켜주는 물리적 장치이다. UART의 데이터 송수신은 데이터 프레임(Data Frame) 단위로 이루어 진다.

(사진 출처: https://developer.electricimp.com/resources/uart)

UART는 내부적으로 Tx단자(Transmitter, 송신기)와 Rx단자(Receiver, 수신기)를 통해 1클럭당 1비트의 송수신을 진행한다. 이렇게 비트 단위로 송수신 된 데이터는 UART 내부에서 Transmit Shift Register/Receive Shift Register로 전달되어 word 또는 byte 단위로 정제되고, 그것이 다시 Tx Data Register/Tx data Register로 전달되어 각 장치 내부의 데이터 버스를 타고 데이터 송수신이 완료되게 된다. 이를 그림을 표현하면 다음과 같다.아래 그림에서 눈여겨 볼 점은 비트 데이터가 Tx Rx 양쪽에서 FIFO 방식으로 넘어가고 들어간다는 것이다.

(사진 출처: https://stackoverflow.com/questions/40949196/receive-transmit-fifo-vs-data-registers-in-uart)

오실로 스코프를 통해 UART 데이터 전송 파형 확인하기

위의 이론적 내용을 눈으로 확인하기 위해 STM32F429ZI 실습보드를 준비하여 PC와 UART 데이터 송수신 연결을 완료하였다. (실습 환경은 STM32 CubeIDE를 통해 진행했다. 실습 셋팅 방법은 생략한다.)

보드의 UART 포트를 열어주고 해당 포트를 통해 printf("2936\n"); 명령을 PC로 전송해보았다.

그리고 PC가 자신의 RX단자를 통해 MCU로부터 받는 데이터 프레임의 파형을 오실로스코프로 관측하면 다음을 확인할 수 있다.

위 파형을 수기로 분석하면 다음과 같은 결과를 얻을 수 있다.

빨간색으로 표기한 비트는 데이터 프레임의 start bit/stop bit를 표현한 것이며, 초록색으로 표기한 비트가 데이터 비트를 표현한다.

앞서 언급하였던 Tx Rx의 FIFO 특성 때문에 보내는 신호와 받는 신호가 데이터 프레임 단위로 앞뒤가 반전되어 들어온다는 것을 확인할 수 있다.