인터럽트 설정을 하기 위해서 NVIC에서 USART1 global interrupt Enabled에 체크합니다.
UART 관련 함수
// Uart 송신 인터럽트 함수: Uart Tx로 데이터를 Size만큼 전송하면 인터럽트가 발생한다.// huart: uart 인스턴스// pData: 송신 데이터 버퍼// Size: 송신 데이터 개수HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
// Uart 수신 인터럽트 함수: Uart Rx로 데이터가 Size만큼 들어오면 인터럽트가 발생한다.// huart: uart 인스턴스// pData: 수신 데이터 버퍼// Size: 수신 데이터 개수HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
UART Interrupt예제
/*
Uart Interrupt Echo 예제
인터럽트로 수신한 Uart 데이터를 전송한다.
main.c
*/uint8_t rx_data;
// 인터럽트 콜백 함수: 인터럽트가 발생되면 이 함수가 호출된다.voidHAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart->Instance == USART1) {
// 데이터 1개를 수신하면 인터럽트를 발생시킨다.HAL_UART_Receive_IT(&huart1, &rx_data, 1);
// 받은 데이터를 전송한다.HAL_UART_Transmit(&huart1, &rx_data, 1, 10);
}
}
voidmain(){
/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();
/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();
/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();
MX_USART1_UART_Init();
/* Initialize interrupts */MX_NVIC_Init();
/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &rx_data, 1);
/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1)
{
/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
예제에서는 간단하게 인터럽트 수신을 받으면 바로 송신하도록 하였지만,
실제 운용할 때에는 Queue Buffer를 구성하고 main 에서 데이터를 빼내어 사용하여야 합니다.