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 |