UART - Universal Asynchronous Receiver/Transmitter
USART - Universal Synchronous/Asynchronous Receiver/Transmitter
동기화 클락의 유무로 UART, USART가 나뉜다.
UART는 비동기 직렬 데이터 송수신, USART는 동기식 직렬 데이터를 송수신한다.
따라서 동기작업을 위해 USART는 클락 신호를 전송한다.
USART
- 데이터 송수신 효율이 높음
- Clock을 사용하기 때문에 데이터가 고정속도로 전송됨
- 데이터를 블록 형태로 전송
- 비동기에 비해 높은 데이터 전송 속도를 가짐
- Clockl핀 추가로 구조적 난이도 및 비용 상승
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 |
댓글