UART (Interrupt & DMA 방식)

유명현·2021년 7월 3일
0

안녕하세요?

오늘은 UART Interrupt & DMA를 다뤄보겠습니다.

먼저 DMA개념에 대해 알아가겠습니다.

< DMA 개념 >

DMA(Direct Memory Access)는 주변장치들이 메모리에 직접 읽거나 쓸 수 있는 기능입니다.

먼저 위의 그림을 보시겠습니다.

Without DMA - DMA를 사용하지 않으므로 주변 장치와 메모리에 데이터 잔송이 발생할 떄 마다 CPU가 처리합니다.

이를 PIO(Programmed Input/Output)이라 부르며, 발생할 때마다 CPU가 처리하므로 효율이 떨어지는 방식입니다.

Processor With DMA - CPU가 해야할 주변장치와 데이터 전송을 DMA가 해줌으로써 효율이 높은 방식입니다.

*자세히 설명을 드리자면 DMA가 주변장치의 데이터 전송이 필요하다면 DMA Controller에게 DMA Request신호를 송신합니다.
(신호에는 전송데이터 크기, 주소, 추가정보 포함)
DMA Controller를 통해 주변장치와 메모리에 사이에 데이터 전송을 하며, 전송이 완료하면 인터럽트를 발생시켜 cpu에게 전송이 끝남을 알림

< UART DMA방식을 이용하기 위한 STM32CubeMX 설정 -1>

UART통신을 하기위해 115200-8-N-1을 설정하고 PC를 통하여 Putty프로그램과 통신하기 위해 UART2를 설정합니다.

< UART DMA방식을 이용하기 위한 STM32CubeMX 설정 -2>

DMA Setting에 들어가서 Add버튼을 통하여 UART2_RX/TX를 추가합니다.

또한 같은 데이터를 연속적으로 보내지 않기 떄문에 Normal를 선택하고 데이터크기는 Byte를 선택합니다.

Increment Address는 데이터를 송/수신할 떄 현재 Periphral과 Memory의 주소를 증가시킬지를 결정하는 항목이므로 체크하지 않도록 합니다.

추가적으로 DMA를 송/수신 완료할 떄 인터럽트를 발생시켜 처리하기 때문에 NVIC 인터럽트 설정도 합니다.

< UART DMA방식 Coding 작성 >

먼저 수신인터럽트를 통해 데이터 입력이 확인이 되면 DMA방식으로 송신/수신을 합니다. (송신을 하는 이유는 입력한 문자를 Putty프로그램에 띄우기 위함)

그다음 송신인터럽트의 코딩 내용은 아래와 같습니다.

먼저 HAL_UART_Recevie 함수를 통해 수신된 문자가 있는지 확인합니다.

수신된 문자를 바로 화면에 띄어주기 위해 바로 아래에 Transmit함수를 통해 전송합니다.

그다음 if( '\r' == uart_test)부분을 통해 엔터입력에 유무를 판단합니다.

엔터입력이 확인 되었으면 rx_data를 통하여 엔터전에 입력한 문자를 모두 보내고 엔터가 입력되지 않았다면 rx_data에 입력한 문자를 저장합니다.

또한 Main 문에서 rx_data를 str_cmp로 비교하여 GPIO출력을 변화시킵니다.

< UART DMA 결과 >

Putty프로그램에 d8_led_on/off과 d9_led_on/off를 입력하여 각 포트에 연결된 led를 제어합니다.

읽어주셔서 감사합니다.

profile
기억보다 기록을

0개의 댓글