본문 바로가기
Robot/임베디드

[STM32] Serial 통신 - UART

by interactics 2022. 2. 23.

UART - Universal Asynchronous Receiver/Transmitter

USART - Universal Synchronous/Asynchronous Receiver/Transmitter

동기화 클락의 유무로 UART, USART가 나뉜다.

UART는 비동기 직렬 데이터 송수신, USART는 동기식 직렬 데이터를 송수신한다. 

따라서 동기작업을 위해 USART는 클락 신호를 전송한다.

 

USART

- 데이터 송수신 효율이 높음

- Clock을 사용하기 때문에 데이터가 고정속도로 전송됨

- 데이터를 블록 형태로 전송

- 비동기에 비해 높은 데이터 전송 속도를 가짐

- Clockl핀 추가로 구조적 난이도 및 비용 상승

 

UART 

https://developer.electricimp.com/resources/uart

- 데이터 시작을 알 수 없어 시작 비트와 정지 비트가 필요함

- 시작 비트는 Always Low 0 , 종료 비트는 Always High 1 이다.

- 데이터를 고정 속도로 전송할 필요 없음 

- 한번에 8비트씩 전송 

 

일반적으로 USART의 비동기 모드가 UART 시리얼 통신이다.

통신 구조는 Tx, Rx, GND 선 3가지를 가진다. 

 

Parity Bit 

패리티비트는 오류 검출 목적으로 추가된 비트이다. 

짝수 패리티 비트와 홀수 패리티 비트 설정방법이 있다. 

 

전체 비트의 데이터 1의 개수들이 짝수개 나오도록 패리티를 부여하는 것이 짝수 패리티이며

전체 비트의 데이터 1의 개수들이 홀수개 나오도록 패리티를 부여하는 것이 홀수 패리티이다.

시리얼 통신의 거리가 멀 경우 적용한다. 짧을 경우는 일반적으로 패리티 비트를 사용하지 않는다.

 

 

UART_HandleTypeDef 구조체

typedef struct
{
  USART_TypeDef                 *Instance;
  UART_InitTypeDef              Init;
  uint8_t                       *pTxBuffPtr;
  uint16_t                      TxXferSize;
  __IO uint16_t                 TxXferCount;
  uint8_t                       *pRxBuffPtr;
  uint16_t                      RxXferSize;
  __IO uint16_t                 RxXferCount;
  DMA_HandleTypeDef             *hdmatx;
  DMA_HandleTypeDef             *hdmarx;
  HAL_LockTypeDef               Lock;
  __IO HAL_UART_StateTypeDef    gState;
  __IO HAL_UART_StateTypeDef    RxState;
  __IO uint32_t                 ErrorCode;
}UART_HandleTypeDef;

Instance : UART Descriptor의 포인터 변수. USART1 등으로 정의됨.

Init : 설정 값들을 지정한다. 

pTxBuffPtr, pRxBuffPtr : 송수신 버퍼 포인터

TxXferSize, RxXferSize : 송수신할 데이터 크기

TxXferCount, RxXferCount : 송수신된 Byte 크기

hdmatx, hdmarx : Tx, Rx 용 DMA 핸들

Lock : 동기화용 변수로 HAL 내부적으로 사용됨

gState : UART의 상태값. Tx 포함

RxState : RX의 상태값

ErrorCode : 에러 코드

 

 

UART 동작 방식

- Polling :

데이터량이 적은 경우, 폴링 Blocking 시간 지연이 다른 기능에 영향이 적을 경우 사용 권장

- interrupt :

데이터 송수신을 대기하지 않음. 따라서 다른 기능의 정지가 없음. 하지만 데이터 송수신량이 많을 경우 동작의 정지가 있을 수 있음.

- DMA 

MCU에서 수행하지 않고 UART가 직접 RAM에 데이터를 저장함. 가장 효율이 좋음.

 

폴링과 인터럽트

어떤 작업을 수행할 때, 외부에서 들어오는 이벤트에 의해 작업을 수행하는 것.

폴링방식 - 정해진 시간, 순서에서 상태를 확인하여 상태의 변화가 있는지 없는 지를 확인

인터럽트 - MCU가 작업을 중단하고 인터럽트 서비스 루틴을 실행하는 것 

 

UART 에러 종류

- PE : Parity check error

- NE : Noise error

- FE : Framing error

- ORE : Overrun error

-DMA : Transfer error

 

 

 

USART1 모드는 비동기로 설정. 이는 UART를 의미한다. 

 

USART1_RX - PA10

USART1_TX - PA9 

 

전송할 문자열

uint8_t str[] = "Hello World!\n\r";

- \n\r 를 둘다 사용하는 이유는 터미널에 따라 \r로 끝나는 경우도 있고 \r\n으로 끝나는 경우가 있기 때문.

 

UART 전송 함수

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

파라미터에 대한 설명

/**
  * @brief  Sends an amount of data in blocking mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the sent data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 provided through pData.
  * @param  huart Pointer to a UART_HandleTypeDef structure that contains
  *               the configuration information for the specified UART module.
  * @param  pData Pointer to data buffer (u8 or u16 data elements).
  * @param  Size  Amount of data elements (u8 or u16) to be sent
  * @param  Timeout Timeout duration
  * @retval HAL status
  */

 

UART 수신

HAL_UART_Transmit(huart, pData, Size, Timeout)

파라미터에 대한 설명

/**
  * @brief  Sends an amount of data in blocking mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the sent data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 provided through pData.
  * @param  huart Pointer to a UART_HandleTypeDef structure that contains
  *               the configuration information for the specified UART module.
  * @param  pData Pointer to data buffer (u8 or u16 data elements).
  * @param  Size  Amount of data elements (u8 or u16) to be sent
  * @param  Timeout Timeout duration
  * @retval HAL status
  */

'Robot > 임베디드' 카테고리의 다른 글

[STM32] CORDIC 가속기  (0) 2023.10.08
[STM32] printf와 float 출력하기  (0) 2022.03.17
[RTOS] 개발 환경 구성  (0) 2022.02.23
[STM32] Microsecond Delay 생성  (0) 2022.02.23
[STM32] 데이터 시트 읽기  (0) 2022.02.19

댓글