폴링 방식의 단점은 개념 카테고리에서 설명했었다. 그렇다면 인터럽트로 데이터를 수신하고 받은 데이터를 PC에 출력하는 프로그램을 작성해보자.
먼저, Cube Mx에서는 usart1을 비동기로 활성화 해주고 Global interrupt를 enable해줘야한다.
우리가 알아야하는 함수는 3가지다.
1. HAL_UART_Receive_IT() - UART 수신 인터럽트를 설정하는 함수다.
2. void USART1_IRQHandler(void) - uart1번을 사용한다고 했을 때, 수신인터럽트가 발생하면 이 함수로 이동하여 IRQ_Handler를 실행하고 HAL_UART_RxCpltCallback()으로 이동한다.
3. HAL_UART_RxCpltCallback() - 결론적으로 이 함수를 호출하므로, 인터럽트 수신이 발생했을 때 하고자하는 처리를 작성해주면 된다.
main.c
//////////////////////
/* USER CODE BEGIN PV */
uint8_t data;
/* USER CODE END PV */
int main(void)
{
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &data, 1);
/* USER CODE END 2 */
while(1)
{
}
}
main파일부터 설명하겠다. 일단 모든 소스코드는 내가 작성한 부분만 가져왔다.
user code Begin2 사이에 HAL_UART_Receive_IT함수를 이용하여 uart1번으로 부터 1byte가 수신되면 data에 저장하고 인터럽트를 발생하도록 설정했다. 정해진 프로토콜이 있다면 그 만큼의 크기를 받았을 때 인터럽트를 발생하게 하도록 하면된다.
주의할점은 Cubemx에서 만든 MX_USART1_UART_Init();함수를 실행한 다음 인터럽트 설정을 해줘야한다. 그래서 begin1사이가 아닌 begin2사이에 코드를 작성했다.
uart.h
/////////////
extern uint8_t data;
출력은 uart.c에서 할 것인데 main.c에서 전역변수로 선언한 data에 저장했으므로 uart.c에서 data에 접근할 수 있도록 extern을 해준다.
uart.c
///////////////
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1, &data, 1, 1000);
HAL_UART_Receive_IT(&huart1, &data, 1);
}
입력받은 값이 data에 저장되있으므로 data를 출력해준다. 그리고 인터럽트 설정을 다시해준다. HAL_UART_Receive_IT함수는 한 번 활성화되고 인터럽트 수행이 되고나면 활성이 꺼지기 때문이다. 만약 계속 인터럽트 수신을 안할려면 설정을 안해줘도 된다. 인터럽트 설정함수는 콜백함수 안에 작성해도 되고 IRQ핸들러 함수 안에서 uart_handler를 호출한 다음에 작성해도 된다.
또 주의할점은 한 바이트씩 수신할 때마다 IRQ_Handler는 실행하지만 Callback함수는 인터럽트 설정함수에서 설정한 size만큼 수신될 때만 호출한다.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 함수는 원래 stm32f7xx_hal_uart.c에 weak함수로 작성되어 있는데 내가 작성하고 싶은 파일에 복사 붙여넣기 한다음에 non-weak로 설정해주면 인터럽트 핸들러에서 원래 weak로 작성된 함수가 아닌 내가 작성한 함수로 이동한다.
인터럽트 송신도 거의 비슷하다. HAL_UART_Transmit_IT()함수를 사용하면 설정한 문자열을 전송한 다음 인터럽트를 발생시키고 IRQ handler에서 HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)를 실행하게 된다. 거의 다른점이 없으므로 더이상 설명하지 않겠다.
callback 개념과 weak함수, 함수 포인터에 대해서도 설명하려했는데 다음에 시간이 되면 작성하겠다.
'MCU 제어 > STM32Cube Mx' 카테고리의 다른 글
[STM32]PWM을 이용하여 BLDC 모터 구동하기 (0) | 2020.03.21 |
---|---|
[STM32] Basic Timer (1) | 2020.03.02 |
Cube MX란? (0) | 2020.02.21 |
[STM32]ST-Link 사용법 및 IAR 디버깅 방법 (0) | 2020.02.02 |
[STM32]UART 통신 입출력 실습 (0) | 2020.02.02 |