본문 바로가기

STM32F469I-DISCO

UART RX : DMA 방식에서 Normal / Circular 모드 비교

A-1 : DMA Normal 모드

1. USART3 활성.

2. USART3 세부 항목에서 global interrupt과 DMA를 normal 모드로 설정한다.

3. main.c 파일 항목 추가.

// int main(void) 추가 부분.

// LED 초기화

HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD, LED2_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD, LED3_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOK, LED4_Pin, GPIO_PIN_SET);

HAL_UART_Receive_DMA(&huart3, rx_buf, RX_BUF_LEN);

////////////////////////////////////////////////////////////////////////////////////////////////////////

/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    if(huart->Instance == USART3)

     {

          if(strncmp((char*)rx_buf, "LED1=1", 6) == 0)

          {

               HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_RESET);

          }

          else if(strncmp((char*)rx_buf, "LED1=0\n", 6) == 0)

          {

               HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_SET);

          }

          HAL_UART_Transmit(&huart3, rx_buf, RX_BUF_LEN, HAL_MAX_DELAY);

 

          HAL_UART_Receive_DMA(&huart3, rx_buf, RX_BUF_LEN);

               // circular mode 차이점. HAL_UART_Receive_DMA 재 호출 필요.

     }

}

/* USER CODE END 4 */

 

 

A-2 : DMA Circular 모드

다른 부분은 동일하고 DMA 모드를 Circular 로 변경하고 ( Generate 진행 )

 

circular 모드 이므로 콜백함수에서 HAL_UART_Receive_DMA 부분을 아래와 같이 주석 처리한다.

 

/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    if(huart->Instance == USART3)

     {

          if(strncmp((char*)rx_buf, "LED1=1", 6) == 0)

          {

               HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_RESET);

          }

          else if(strncmp((char*)rx_buf, "LED1=0\n", 6) == 0)

          {

               HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_SET);

          }

          HAL_UART_Transmit(&huart3, rx_buf, RX_BUF_LEN, HAL_MAX_DELAY);

 

          // HAL_UART_Receive_DMA(&huart3, rx_buf, RX_BUF_LEN);

               // circular mode 차이점. HAL_UART_Receive_DMA 재 호출 필요.

     }

}

/* USER CODE END 4 */

 

 

DMA Normal 과 Circular 의 차이는 단순한 "HAL_UART_Transmit" 의 재호출 여부에만 있는 것이 아님.

Circular 모드에서는 항상 DMA가 진행중이며, Normal 모드에서는 인터럽트 + 함수로 인하여 CPU 개입이 빈번하게 발생됨.

Ring Buffer과 다양한 예외 조건을 추가하여 Circular 모드로 적용하는 것이 바람직하다고 판단됨. 

'STM32F469I-DISCO' 카테고리의 다른 글

STM32F469I DISCO - FMC - 128Mbit SDRAM  (1) 2025.06.27
UART RX : Polling, Interrupt 비교  (0) 2025.06.23
STM32에서 콘솔 텍스트 출력.  (1) 2025.06.21
Blink LED  (1) 2025.06.20
STM32F469 Discovery kit 관련.  (0) 2025.06.20