Embedded/STM32

[STM32] UART, USART

유제필 2022. 11. 12. 18:53

UART(Universal Asychronous Receiver/Transmitter)란

데이터를 직렬, 또는 병렬로 변환시켜주는 범용 비동기 수신기로 두 장치 사이에 데이터가 전송될 때 수신부의 클럭에 동기되지 않는 방식

 

USART(Universal Synchronous and Asychonous Receiver/Transmitter)

비동기 뿐만 아니라 동기 통신도 가능한 범용 동기/비동기 수신기로 두 장치 사이에 데이터가 전송될 때 수신부의 클럭이 송신부의 클럭에 동기되는 방식임. 동기를 위해서 별도의 클럭 단자를 이용해서 송신부의 클럭을 수신부에 공급하는 방법을 많이 사용함

통신 방식

통신에 사용되는 라인의 수를 기준으로 구분하면 직렬 통신과 병렬 통신으로 나눌 수 있다.

렬 통신은 1개의 라인만을 이용하여 1클럭당 1비트를 전송하는 방식이고,

병렬 통신에서는 현재 8비트 또는 16비트의 데이터 전송 방법을 많이 사용하고 있다.

직렬 통신의 예)

- 모르스(Morse) 부호를 사용하는 통신

- RS-232C, RS-422, RS-485

- USB, TCP/IP, CAN

- I2C, SPI

- FireWire, PCI Express

병렬 통신은 1클럭 시간에 통신 라인 수만큼 데이터 전송이 가능하며(데이터 라인이 8개인 경우 8비트 데이터 전송),

1개의 데이터만 보낼 수 있는 직렬 통신 보다는 개념적으로 통신 속도가 빠르다.

최근에는 직렬 통신이 병렬 통신보다 훨씬 빠른 클럭의 사용이 가능해지면서 오히려 직렬 통신의 속도가 빨라지는 경우도 발생하게 되었다.

 

직렬 통신에서 고주파수의 클럭의 사용이 가능한 이유는 통신에 필요한 라인의 개수가 병렬 통신보다

훨씬 적으므로 외부 노이즈의 차폐가 용이하고 크로스토크(crosstalk) 등의 전기적 특성이 유리하기 때문이다.

통신은 데이터의 흐름 방법에 따라 나눌 수 있다.

단방향(Simplex) : 데이터가 한 방향(A -> B)로만 전송되는 것 (라디오 방송, TV 등)

 

반이중(Half-Duplex) : 데이터가 양 방향으로 (A -> B, B <- A)가능하나

동시에 양방향 통신은 불가능한 것 (워키토키, RS-485)

 

전이중(Full-Duplex) : 데이터를 동시에 양방향(A <-> B) 으로 전송이 가능한 것 (전화, RS-232C)

UART의 데이터 송수신 과정

송신 : 송신 데이터 레지스터(Transmit Data Register)는 전송할 데이터를 데이터 버스를 통해 받아 저장하고

이 데이터는 송신 쉬프트 레지스터(Transmit Shift Register)로 전달된다.

여기까지 데이터는 워드 또는 바이트 단위로 전달되고 송신 쉬프트 레지스터는 데이터를

트 단위로 TX단자를 통해 외부로 보낸다.

수신 : 수신될 데이터는 외부에서 RX 단자를 통해 수신 쉬프트 레지스터(Receive Shift Register)로 들어오게 되는데,

수신 쉬프트 레지스터는 비트 단위로 수신된 데이터를 모아서 워드 또는

바이트 단위로 만들어 수신 데이터 레지스터(Receive Data Register)로 전달한다.

수신 데이터 레지스터에 저장된 데이터는 데이터 버스를 통해 칩의 내부로 전달된다.

 

송수신 제어부(Transmit/Receive Control)는 송신, 수신 과정을 제어해주는 역할을 하며 클럭

제어부(Clock Control)는 송신, 수신에 필요한 클럭을 만들어 내거나 제어하는 역할을 한다.

UART 데이터 프레임(Data Frame)의 구성

UART의 데이터 송수신은 프레임(Frame) 단위로 이루어진다.

시작 비트 (1비트) - 데이터 비트 (5 ~ 8 비트) - 패리티 비트 (1비트, 옵션) - 1 ~ 2비트의 정지 비트

시작 비트는 Low, 정지 비트는 High 값을 가지며 데이트의 비트는 8 또는 9비트로 설정할 수 있으며,

USART_CR1 레지스터의 M 비트의 설정 값에 따라 결정된다.

데이터 비트의 제일 마지막은 패리티 비트가 될 수도 있다.

데이터 전송의 속도는 보 레이트로 나타낸다.

보 레이트(Baud Rate)란 데이터의 전송 속도를 나타내는 말이다. 1보(Baud)는 1초에 전자적인 상태가 1번 변화하는 것을 말하며 보 레이트가 1이면 1초에 1비트의 데이터가 전송된다.

전송 속도를 나타내기 위해 더 정확한 용어인 bps(bits per second)를 사용한다.

데이터 송신 중 Idle Freame 상태와 Low Break 상태가 있다.

Idle Frame : 시작 비트를 포함한 모든 비트가 High 상태

Low Break : 시작 비트를 포함한 모든 비트가 Low 상태

정지 비트는 송수신 모드에 따라 달라진다.

1비트 : 디폴트 값

2비트 : 싱글 와이어 및 모뎀 모드의 USART 통신

0.5 비트 : 스마트카트 모드의 데이터 송신시

1.5 비트 : 스마트카트 모드의 데이터 송신시

 

USART 내부 주요 구성 요소

1. 송수신 : 송신 데이터 레지스터(Transmit Data Register : TDR)

1) 송신 쉬프트 레지스터(Transmit Shift Register)

2) 수신 데이터 레지스터(Receive Data Register : RDR)

3) 수신 쉬프트 레지스터(Receive Shift Register)

 

2. 제어 요소 : 송신 제어기(Trasmit Control)

1) 수신 제어기(Receive Control)

2) 클럭 제어기(CK Control)

3) USART 인터럽트 제어기(USART Interrupt Control)

4) 그 외 각종 레지스터(GTPR, CR1~3, SR, USART_BRR 등)

데이터 전송 모드

블로킹 모드(Blocking Mode) : 폴링 모드

비 블로킹 모드(Non Blocking Mode) : 인터럽트, DMA

데이터 처리가 완료되면 UART_IRQ나 DMA가 발생한다.

그리고 HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() 또는

HAL_TxRxCpltCallback() 콜백 함수가 호출된다.

통신 에러가 발생한 경우는 HAL_UART_ErrorCallback() 함수가 호출된다.

UART 함수 사용 방법

1. 클럭 활성화

1) __HAL_RCC_USARTx_CLK_ENABLE() 함수를 이용하여 사용할 USARTx의 클럭 활성화

2) __HAL_RCC_GPIOx_CLK_ENABLE() 함수를 이용하여 USART 핀으로 사용할 GPIO 클럭 활성화

2. UART로 사용할 GPIO핀을 대체 기능(Alternate Function) 모드로 하고

UART 핀으로 사용하도록 설정한 다음 HAL_GPIO_Init() 함수를 이용하여 초기화

3. UART_HandleTypeDef 구조체 변수를 이용하여 UART를 설정하고

HAL_UART_Init() 함수를 이용하여 동작조건 설정

4. 통신 모드에 따라 함수를 이용하여 데이터를 송수신

Blocking Mode : HAL_UART_Transmit(), HAL_UART_Receive(0

Non Blocking Mode : HAL_UART_Trasmit_IT, HAL_Receive_IT(), HAL_UART_IRQHandler()

DMA Mode : HAL_UART_Trasmit_DMA(), HAL_UART_Receive_DMA()

 

UART의 파라미터 설정

UART는 비 동기 통신이므로 다음의 파라미터만 설정하면 됨

1. Buad Rate

2. Word Length

3. Stop Bit

4. Parity

5. Hardware Flow Control

6. Reciever/Transmitter Modes

UART 에서 인터럽트를 발생시키는 경우

1. HAL_NVIC_SetPriority() 함수를 이용하여 해당 인터럽트의 우선 순위를 설정

2. HAL_EnableIRQ() 함수를 이용하여 인터럽트 활성화

3. 해당 인터럽트의 ISR(Interrupt Service Routine) 작성

4. 해당 인터럽트의 콜백 함수 작성 (인터럽트 발생 시 처리해야 할 내용)

UART 설정 구조체

함수 명
설명
UART_HandleTypeDef
UART 설정 구조체
USART_TypeDef * Instance : UART Register Base Address
UART_InitTypeDef Init : UART 통신 파라미터
uint8_t pTxBuffptr : UART Tx 버퍼
uint16_t TxXferSize : UART Tx 크기
uint16_t TxXferCount : UART Tx 카운터
uint8_t pRxBuffPtr : UART Rx 버퍼
uint16_t RxXferSize : UART Rx 크기
uint16_t RxXferCount : UART Rx 카운터
DMA_HandleTypeDef * hdmatx : UART Tx DMA 핸들러 파라미터
DMA_HandleTypeDef * hdmarx : UART Rx DMA 핸들러 파라미터
HAL_LockTypeDef Lock : Locking Object
__IO_HAL_UART_StateTypeDef State : UART 통신 상태
__IO unit32_t ErrorCode : UART 에러 코드

 

 

UART 구동용 함수

함수 명
설명
HAL_UART_Init()
(UART_HandleTypeDef * huart)
UART_InitTypeDef에 명시된 파라미터에 따라 UART 모드 초기화
[Parameter] : huart : UART Handle
[Return] : HAL Status
HAL_UART_DeInit
(UART_HandleTypeDef * huart)
UART 주변장치 해제
[Parameter] : huart : UART Handle
[Return] : HAL Status
HAL_UART_Receive
(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size,
uint32_t Timeout)
데이터를 블로킹 모드로 수신
[Parameter] :
huart : UART Handle
pData : 데이터 버퍼
Size : 입력받을 데이터의 크기
Timeout : 지연시간
[Return] : HAL Status
HAL_Receive_IT
(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size)
데이터를 비 블로킹 모드로 수신
[Parameter] :
huart : UART Handle
pData : 데이터 버퍼
Size : 입력받을 데이터의 크기
Timeout : 지연시간
[Return] : HAL Status

 

함수 명
설명
HAL_UART_Trasmit
(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size,
uint32_t Timeout)
데이터를 블로킹 모드로 송신
[Parameter] :
huart : UART Handle
pData : 데이터 버퍼
Size : 입력받을 데이터의 크기
Timeout : 지연시간
[Return] : HAL Status
HAL_UART_Trasmit_IT
(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size)
데이터를 비 블로킹 모드로 송신
[Parameter] :
huart : UART Handle
pData : 데이터 버퍼
Size : 입력받을 데이터의 크기
[Return] : HAL Status
HAL_UART_Trasmit_DMA
(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size)
데이터를 비 블로킹 모드로 DMA를 통해 송신
[Parameter] :
huart : UART Handle
pData : 데이터 버퍼
Size : 입력받을 데이터의 크기
[Return] : HAL Status
HAL_UART_Receive_DMA
(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size)
데이터를 비 블로킹 모드로 DMA를 통해 수신
[Parameter] :
huart : UART Handle
pData : 데이터 버퍼
Size : 입력받을 데이터의 크기
[Return] : HAL Status
HAL_UART_IRQHandler
(UART_HandleTypeDef * huart)
UART 인터럽트
[Parameter] : huart : UART Handle
[Return] : 없음
HAL_UART_TxCpltCallback
(UART_HandleTypeDef * huart)
송신완료 시 호출되는 콜백 함수
[Parameter] : huart : UART Handle
[Return] : 없음
HAL_UART_RxCpltCallback
(UART_HandleTypeDef * huart)
수신완료 시 호출되는 콜백 함수
[Parameter] : huart : UART Handle
[Return] : 없음
HAL_UART_GetState
(UART_HandleTypeDef * huart)
UART의 동작 상태를 읽어옴
[Parameter] : huart : UART Handle
[Return] : HAL State
HAL_UART_GetError
(UART_HandleTypeDef * huart)
UART의 에러 상태를 읽어옴
[Parameter] : huart : UART Handle
[Return] : UART 에러 코드

 

UART 구동용 매크로

UART 에러 코드

HAL_UART_ERROR_NONE

HAL_UART_ERROR_PE

HAL_UART_ERROR_NE

HAL_UART_ERROR_ORE

HAL_UART_ERROR_DMA

 

UART 매크로

__HAL_UART_RESET_HANDLE_STATE

__HAL_UART_GET_FLAG

__HAL_UART_CLEAR_FLAG

__HAL_UART_CLEAR_PEFLAG

__HAL_UART_CLEAR_FEFLAG

__HAL_UART_CLEAR_NEFLAG

__HAL_UART_ENABLE_IT

__HAL_UART_DISABLE_IT

__HAL_UART_GET_IT_SOURCE

__HAL_UART_ENABLE

__HAL_UART_DISABLE

 

UART 인터럽트 정의

UART_IT_PE

UART_IT_TXE

UART_IT_TC

UART_IT_RXNE

UART_IT_IDLE

UART_IT_LBD

UART_IT_CTS

UART_IT_ERR

 

UART 상태

UART_STATE_DISABLE

UART_STATE_ENABLE

'Embedded > STM32' 카테고리의 다른 글

[STM32] RCC 설정용 구조체 및 구동 함수  (0) 2022.11.12
[STM32] Timer  (0) 2022.11.12
[STM32] ADC(Analog Digital Converter)  (0) 2022.11.12
[STM32] DAC(Digital Analog Convertor)  (2) 2022.11.12