STM32F0 UART 수신 인터럽트 코드 작성하기
STM32F0 UART 수신 인터럽트 코드 작성 예제입니다.
STM32F091RC USART 인터럽트 목차
HAL 드라이버는 유저 편의성을 많이 고려하다보니, 코드가 무겁다.
그리고 때로는 설정이 제한되어 원하는대로 코드를 작성하지 못하기도 한다.
HAL_UART_Receive_IT
수신 인터럽트를 사용하려면 위 함수를 사용하면 된다.
입력인자로, UART의 핸들러를 입력하고, 저장할 데이터와 사이즈를 지정하면 된다.
그래서 while문 앞에 선언을 해두었다.
함수를 최대한 간단하게 만들어서 저 한 줄로 줄여 놓은건데,
ATmega 코드 짜던 시절을 떠올려보니 이해가 안가는 것이 한 둘이 아니다.
그래서 샅샅이 띁어봐서 어떻게 돌아가는지를 알아봤는데,
너무 어려워 할 것 같아서 자세히 서술하지 않겠다.
간단히 정리하면 아래와 같다.
- HAL_UART_Receive_IT 로 인터럽트를 설정한다.
- 인터럽트가 걸리면 길이만큼 데이터를 저장한다.
- 인터럽트 안걸리게 초기화한다.
- 이 모든 과정이 처리되면 인터럽트 처리 함수를 호출한다.
그러니까.. 인터럽트가 안걸리게 초기화 되니까 반복해서 인터럽트가 걸리게 설정하려면
인터럽트 처리 함수(콜백)함수를 호출하고 다시 HAL_UART_Receive_IT로 설정해야 한다.
데이터 길이를 알아야 하는 번거로움은 덤이다.
그러면 인터럽트 처리 함수를 알아볼 차례다.
HAL_UART_RxCpltCallback
그러니까.. 3번 과정까지 완벽하게 처리되면 호출되는 함수라는 뜻이다.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
함수 끌어다 박으면 된다.
끌어다 박으면 알아서 호출되니 얼마나 좋은가.
나는 코드를 위처럼 짯다. 인터럽트 걸린 uart가 uart2일때 데이터를 보내도록 설정했다.
uart2가 맞다면, a를 입력했을때, a를 회신하도록 설정해 두었고,
다시 HAL_UART_Receive_IT를 호출했다.