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를 호출했다.