STM32F0 UART 수신 인터럽트 코드 작성하기

STM32F0 UART 수신 인터럽트 코드 작성하기

STM32F0 UART 수신 인터럽트 코드 작성 예제입니다.

STM32F091RC USART 인터럽트 목차

  1. STM32F0 UART 인터럽트 CUBEMX 로 기초 설정하기
  2. STM32F0 UART 수신 인터럽트 코드 작성하기 (현재 포스팅)

 

HAL 드라이버는 유저 편의성을 많이 고려하다보니, 코드가 무겁다.

그리고 때로는 설정이 제한되어 원하는대로 코드를 작성하지 못하기도 한다.

HAL_UART_Receive_IT

수신 인터럽트를 사용하려면 위 함수를 사용하면 된다.

 

입력인자로, UART의 핸들러를 입력하고, 저장할 데이터와 사이즈를 지정하면 된다.

 

그래서 while문 앞에 선언을 해두었다.

 

함수를 최대한 간단하게 만들어서 저 한 줄로 줄여 놓은건데,

ATmega 코드 짜던 시절을 떠올려보니 이해가 안가는 것이 한 둘이 아니다.

그래서 샅샅이 띁어봐서 어떻게 돌아가는지를 알아봤는데,

너무 어려워 할 것 같아서 자세히 서술하지 않겠다.

간단히 정리하면 아래와 같다.

 

  1. HAL_UART_Receive_IT 로 인터럽트를 설정한다.
  2. 인터럽트가 걸리면 길이만큼 데이터를 저장한다.
  3. 인터럽트 안걸리게 초기화한다.
  4. 이 모든 과정이 처리되면 인터럽트 처리 함수를 호출한다.

그러니까.. 인터럽트가 안걸리게 초기화 되니까 반복해서 인터럽트가 걸리게 설정하려면

인터럽트 처리 함수(콜백)함수를 호출하고 다시 HAL_UART_Receive_IT로 설정해야 한다.

데이터 길이를 알아야 하는 번거로움은 덤이다.

 

그러면 인터럽트 처리 함수를 알아볼 차례다.

HAL_UART_RxCpltCallback

그러니까.. 3번 과정까지 완벽하게 처리되면 호출되는 함수라는 뜻이다.

 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

함수 끌어다 박으면 된다.

 

끌어다 박으면 알아서 호출되니 얼마나 좋은가.

나는 코드를 위처럼 짯다. 인터럽트 걸린 uart가 uart2일때 데이터를 보내도록 설정했다.

 

uart2가 맞다면, a를 입력했을때, a를 회신하도록 설정해 두었고,
다시 HAL_UART_Receive_IT를 호출했다.

 

 

데이터가 잘 회신되는 것을 볼 수있다.

 

 

 

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

%d 블로거가 이것을 좋아합니다: