본문 바로가기
임베디드 쌩초보 공부/STM32

STM32 CubeIDE , HAL을 사용한 Uart/Usart 공부(2) Rx Polling

by 존버매니아.임베디드 개발자 2021. 12. 15.
반응형

★ CubeIDE의 Code Gen 기능과 HAL 라이브러리를 사용하여 Uart 메세지를 Polling 형태로 받아보자

참고로 polling형태로 메세지를 받을 때는 cube툴에서 Uart Rx Interrupt를 Enable 할 필요가 없다.

하지만 Rx Interrupt를 enable 했다고해서 폴링형태로 메세지를 받는것을 못하는 것은 아니다.

 

메세지 수신시 IRQ를 호출하고싶으면 cube툴에서 Rx Interrupt enable이 필수

메세지 수신을 폴링형태로 할거라면 cube툴에서 Rx Interrupt enable해도 동작되고 안해도 동작됨


2021.12.12 - [임베디드 쌩초보 공부/STM32] - STM32 CubeIDE , HAL을 사용한 Uart/Usart 공부(1) Rx Interrupt

랑 cube 셋팅은 똑같이 하는데 Interrupt enable만 안하면 된다. 그리고 code gen을 하자.

 

그러면 code gen이 될 것이고, 따라서 mcu입장에서 uart 통신을 할 준비는 끝이난다.


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

인터럽트 형태로 받을때는 HAL_UART_Receive_IT 함수를 썼는데 폴링방식은 HAL_UART_Receive 함수를 사용한다.

_IT 함수랑 차이점은 Timeout이라는 파라미터가 추가된 점이다.

 

_IT 함수의 경우 HAL_UART_Receive_IT 를 호출해놓고 mcu는 다른 코드를 실행하고 있을 수 있다.

그런데 HAL_UART_Receive 함수의 경우 폴링방식이기 때문에 다른 코드를 실행하는게 아니라 uart 메세지가 수신될때까지 while 형태로 계속 기다리고 있는다. 

 

근데 이렇게하면 만약

HAL_UART_Receive  함수를 호출했는데 mcu로 uart 메세지가 수신되지 않으면 mcu가 다른동작을 못하고 계속 uart 메세지 오는것만 기다리고 있으니까 시스템 입장에선 문제가 된다.

해당 mcu가 uart 통신만 하는게 아니라 led도 깜빡여야되고 블루투스 와이파이 통신도 해야하는데

다른 작업을 아무것도 못하고 uart메세지 수신만 기다리고 있기 때문이다.

그런 문제를 방지하기 위해서 존재하는 파라미터가 Timeout 파라미터이다.

 

Timeout 의 의미가 뭐냐면

메세지 수신을 기다리면서 timeout 변수 카운트를 계속 1씩 깍는다

이 때 1을 깍는데 걸리는 시간은 system timer 인터럽트 시간이랑 같다.

암튼 그래서 메세지 수신을 할 때까지 무한히 기다리는게 아니라 기다리고 기다리다가 timeout tick count가 계속감소해서 0에 도달하면

에러를 return 하고 다음 동작으로 넘어가는 방식이다.

 

그 외에는 앞에서 살펴봤던 uart_receive_it랑 똑같아서 상세한 설명은 생략한다.

반응형

'임베디드 쌩초보 공부 > STM32' 카테고리의 다른 글

STM32 ADC Conversion  (0) 2021.12.26
Stm32 cube ide hal 을 이용한 uart tx  (1) 2021.12.17
STM32 CubeIDE , HAL을 사용한 Uart/Usart 공부(1) Rx Interrupt  (1) 2021.12.12
reserve3  (0) 2021.12.12
전반적인 reserved2  (0) 2021.12.12