저번 글에서 uart 수신을 while문 안에서 처리하는 polling 방식을 사용했었는데 polling 방식은 cpu의 리소스를 많이 차지하기 때문에 uart 신호가 들어오면 인터럽트를 통해 데이터를 처리하는 방식을 사용해보고자 한다.
ioc에서 관련 세팅을 해보자
먼저 connectivity -> USART2 ->NVIC settings 에서 Global interrupt를 선택하고 저장해서 코드를 생성한다.
그리고 UART Interrupt 관련 코드를 찾기 위해 Drivers -> STM32F4xx_HAL_Driver -> Src -> stm32f4xx_hal_uart.c 에 들어가서 코드를 찾는다.
HAL_UART_Receive_It 함수 구조를 살펴보면 Uart 핸들러 타입, 받은 값을 저장할 버퍼, 버퍼 크기 이렇게 3개를 매개변수로 받는다.
먼저 main.c에 데이터를 받을 버퍼를 전역 변수로 선언해준다.
/* USER CODE BEGIN 0 */
uint8_t data[1];
/* USER CODE END 0 */
HAL_UART_Receive_It 함수를 main문에 추가하고
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, data, sizeof(data));
/* USER CODE END 2 */
stm32f4xx_it.c 파일에 들어가보면 USART2_IRQHandler가 생성되어있는것을 확인할 수 있다.
uart 인터럽트가 발생하면 이 함수가 실행되게 된다.
우리는 아래 callback 함수를 통해 인터럽트 신호가 발생하면 해당 값을 송신 받고 받은 값을 수신하는 코드를 작성할 것이다.
이 HAL_UART_RxCpltCallback 함수를 main.c에 넣고 아래와 같이 코드를 작성한다.
먼저 uart를 통해 데이터가 송신이 되면 callback 함수가 실행되고 다음 데이터를 다시 uart로 받을 준비를 하면서 받은 데이터 값을 출력하는 코드이다.
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart2, data, sizeof(data));
HAL_UART_Transmit(&huart2, data, sizeof(data), 100);
}
/* USER CODE END 4 */
그리고 teraterm에 포트, 속도, 패리티, 스탑비트, 흐름제어와 같은 파라미터들을 ioc에서 설정했던 값이랑 동일하게 세팅하고
teraterm을 통해 데이터를 수신하면
수신한 값이 그대로 다시 송신되는 것을 확인할 수 있다.
'[Harman] 임베디드 시스템을 위한 sw 구조설계' 카테고리의 다른 글
[부산 인력개발원 Harman 과정]임베디드 시스템을 위한 sw 구조설계 6 (0) | 2023.05.03 |
---|---|
[부산 인력개발원 Harman 과정]임베디드 시스템을 위한 sw 구조설계 4 (0) | 2023.04.30 |
[부산 인력개발원 Harman 과정]임베디드 시스템을 위한 sw 구조설계 3 (0) | 2023.04.30 |
[부산 인력개발원 Harman 과정]임베디드 시스템을 위한 sw 구조설계 2 (0) | 2023.04.30 |
[부산 인력개발원 Harman 과정]임베디드 시스템을 위한 sw 구조설계 1 (0) | 2023.04.30 |