반도체, 임베디드 Study/STM32

STM32 - UART 이론 - (2)

잇(IT) 2024. 5. 26. 23:04
728x90

https://insoobaik.tistory.com/612

 

STM32 - UART 이론 - (1)

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

insoobaik.tistory.com

UART에 대한 기본적인 이론에 이어서 STM32를 통해 UART에 대해 조금 더 자세히 알아보겠다.


UART (Universal Asynchronous Receiver/Transmitter) 범용 비동기식 직렬 통신 컨트롤러

PC와 타겟 보드가 통신할 때 가장 기본으로 사용하는 통신 포트다.

 

UART는 CPU와 PC등에 기본 장착되어 있어 호환성이 좋지만 1대 1 통신등의 제한이 있어 확장성이 떨어진다.

 

UART는 RS-232형식을 따라 총 9개의 신호선으로 구성되어 있다.

그 중 2 - Received Data / 3 - Transmitted Data / Signal Ground 3개의 핀만 연결되어 있으면 통신이 가능하다.

 

TXD는 상대편 RXD에 RXD는 상대편 TXD에 GND는 GND끼리 연결해야 한다.

STM32F429ZI의 UART에는 총 8개의 포트가 존재한다.


Nucleo-F429 보드에 UART를 연결

ST-Link 파트의 STM32F103은 USB 인터페이스로 PC와 연결된다.

MUC 파트의 STM32F429는 USART3 인터페이스를 사용하여 STLK_TX, STLK_RX라는 이름의 라인으로 ST-Link 파트의 STM32F103과 UART 인터페이스로 연결된다.

 

즉, STM32F429의 UART 데이터를 STM32F103이 USB 데이터로 변환하여 PC에 넘겨주는 구조다.

 

ST-LINK의 UART 회로도

 

MCU의 UART 회로도

 

STMicroelectronis STLink Virtual COM Port(COM3)은 UART port에 해당한다.

ST-Link 파트의 STM32F103에 USB CDC(Communication Device Class) 프로토콜이 있기 때문에 편리한 UART 통신이 가능한 것이다.


STM32F429의 UART 블록을 보게되면 8개의 외부핀을 확인할 수 있다.

- TX : 송신핀

- RX : 수신핀

- SW_RX

- IRDA_IN : 적외선 통신 입출력핀

- IRDA_OUT : 적외선 통신 입출력핀

- RTS : 통신 제어용 핀 Request to send(수신 가능 상태시 Low로 signal 변환)

- CTS : 통신 제어용 핀 Clear to send(CTS 신호가 Low 시에 데이터 전송

- CK : 동기식 통신을 할 때 사용되는 클럭 핀


UART_InitTypeDef는 UART의 동작 조건을 설정하기 위한 구조체이며 stm32f4xx_hal_uart.h에 정의되어 있다.

 

- BaudRate : UART 통신 보레이트를 설정

- WordLength : 송수신할 데이터 비트의 크기를 지정한다.

  UART_WORDLENGTH_8B

  UART_WORDLENGTH_9B

- StopBits : stop 비트의 크기를 지정

  UART_STOPBITS_1

  UART_STOPBITS_2

- Parity : parity 모드 지정

  UART_PARITY_NONE

  UART_PARITY_EVEN

  UART_PARITY_ODD

  패리티가 활성화되면 전송 데이터의 MBS 위치로 들어가게 된다.

- Mode : 송수신 모드를 활성화 또는 비활성화로 지정
  UART_MODE_RX
  UART_MODE_TX
  UART_MODE_TX_RX
- HwFlowCtl : Hardware Flow Control 모드를 활성화 또는 비활성화로 지정한다.
  UART_HWCONTROL_NONE
  UART_HWCONTROL_RTS
  UART_HWCONTROL_CTS
  UART_HWCONTROL_RTS_CTS

- OverSampling : Oversampling을 활성화 또는 비활성화로 지정한다.

  Oversampling은 항상 16으로 설정
  UART_OVERSAMPLING_16


UART HAL 함수

 

UART의 초기화 및 설정용 함수
HAL_UART_Init(), HAL_UART_DeInit() : UART의 초기화, 초기화 해제
HAL_UART_MspInit(), HAL_UART_MspDeInit() : UART Msp의 초기화, 초기화 해제

 

UART의 입출력용 함수
HAL_UART_Transmit() : 블로킹 모드(폴링)로 데이터 송신
HAL_UART_Receive() : 블로킹 모드(폴링)로 데이터 수신
HAL_UART_Transmit_IT() : 비 블로킹(인터럽트) 모드로 데이터 송신
HAL_UART_Receive_IT() : 비 블로킹(인터럽트) 모드로 데이터 수신
HAL_UART_Transmit_DMA() : DMA를 사용하여 비 블로킹 모드로 데이터 송신
HAL_UART_Receive_DMA() : DMA를 사용하여 비 블로킹 모드로 데이터 수신
HAL_UART_IRQHandler() : UART 인터럽트 처리 핸들러 함수

 

콜백 함수(Callback Function)
  콜백 함수는 다음과 같으며 반드시 사용자 프로그램에서 작성 되어야한다.
HAL_UART_TxCpltCallback()
HAL_UART_RxCpltCallback()

 

데이터 전송에는 다음의 2가지 모드로 구성된다.
1. 블로킹 모드(Blocking Mode) 또는 폴링 모드 : 통신은 폴링 모드
2. 비 블로킹 모드(Non Blocking Mode) : 통신은 인터럽트 or DMA


데이터 처리가 완료되면 UART IRQ(인터럽트 모드인 경우)나 DMA IRQ(DMA 모드인 경우) 발생
HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() 또는 HAL_USART_TxRxCpltCallback() 콜백함수가 호출
통신 에러가 발생한 경우 HAL_UART_ErrorCallback() 콜백함수가 호출


HAL_UART_Init(UART_HandleTypeDef *huart)

// huart : UART handle

파라미터에 따라 UART 모드를 초기화 시킨다.

반환값으로 HAL status를 반환한다.

HAL_UART_DeInit(UART_HandleTypeDef *huart)

// huart : UART handle

UART 주변장치를 초기화 해제한다.

 

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

// huart : UART handle
// pData : 데이터 버퍼
// Size : 입력받을 데이터의 크기
// Timeout : 지연 시간

데이터를 블로킹 모드로 수신한다.

 

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

// huart : UART handle
// pData : 데이터 버퍼
// Size : 입력받을 데이터의 크기

데이터를 비블로킹 모드로 수신한다.

 

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

// huart : UART handle
// pData : 데이터 버퍼
// Size : 입력받을 데이터의 크기
// Timeout : 지연 시간

데이터를 블로킹 모드로 송신한다.

 

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

// huart : UART handle
// pData : 데이터 버퍼
// Size : 입력받을 데이터의 크기

데이터를 비블로킹 모드로 송신한다.

 

HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

// huart : UART handle

송신 완료 시 호출되는 Callback 함수

 

HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

// huart : UART handle

수신 완료 시 호출되는 Callback 함수

 

HAL_UART_GetState(UART_HandleTypeDef *huart)

// huart : UART handle

UART 상태를 반환한다.

 

HAL_UART_GetError(UART_HandleTypeDef *huart)

// huart : UART handle

UART 에러 상태를 반환

 

HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

// huart : UART handle

UART 인터럽트를 처리하는 인터럽트 핸들러

728x90