Language/AVR

STM32 : UART

짱도르딘 2024. 9. 12. 17:05
728x90

UART

Rx

 

이번에는 STM32를 통해 UART를 제어하려 한다.

 

우선 UART를 제어하기 위해서 아래와 같이 UART2를 킨다. 핀은 다음과 같이 자동적으로 배정된다.

 

 

 

UART를 설정하고, 코드를 작성하려 하면 아래와 같이 자동적으로 관련 헤더파일이 선언된 것을 확인할 수 있다.

 

메인 코드는 아래와 같이 작성하였다.

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Receive(&huart2, &rxData[0], 4, 100);

	  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
	  HAL_Delay(200);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

코드를 디버그 하고, ComPortMaster를 실행시키고 'a'를 보내보면 아래와 같이 통신되는 것을 확인할 수 있다.

Rate는 115200으로 설정하였다.

 


인터럽트 제어

 

이번에는 인터럽트를 활성화해보려 한다.

 

아래와 같이 Global Interrupt를 체크한다.

 

 

main 내에 아래와 같은 코드를 추가해 준다.

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Receive_DMA(&huart2, rxData, sizeof(rxData));
}
/* USER CODE END 0 */

 

디버깅을 하고, 위와 동일하게 문구를 보내면 아래와 같이 문구가 출력되는 것을 확인할 수 있다.

 


 

이번에는 DMA를 활용하여 인터럽트를 제어하려고 한다.

 

우선 아래와 같이 RX를 추가한다.

 

코드는 아까와 동일하지만, IT를 DMA로 변경해 준다.

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Receive_DMA(&huart2, rxData, sizeof(rxData));
}
/* USER CODE END 0 */

 

디버깅하고 ComPortMaster로 데이터를 보내면 아래와 같이 Value에 출력되는 것을 확인할 수 있다.

 


Tx

 

 

이번에는 Rx가 아닌, Tx로 데이터를 받아오려고 한다.

 

"Hello World!!!"데이터를 받아오기 위해 아래와 같이 코드를 작성한다.

 

while문 내에는 아래와 같이 코드를 작성한다.

 while (1)
  {

	  HAL_UART_Transmit(&huart2, txData, sizeof(txData), 100);
	  HAL_Delay(500);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

코드를 돌려보면, ComPortMaster에 다음과 같이 "Hello World!!!"가 출력되는 것을 확인할 수 있다.

 


 

이번에는 인터럽트를 사용해서 Tx를 제어해보려 한다.

Transmit와 Receive 관련 코드는 아래와 같이 작성했다.

 

아래는 위에 인터럽트를 제어했던 상황과 동일하게 콜백 함수를 선언하였다.

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART2)
	{
		HAL_UART_Transmit_IT(&huart2, &txData, sizeof(txData));
	}
	
	HAL_UART_Receive_IT(&huart2, &txData, sizeof(txData));
}

 

코드를 돌려보면 ComPortMaster에서 Send 할 때마다 Value에 출력되는 것을 확인할 수 있다.

728x90

'Language > AVR' 카테고리의 다른 글

STM32 : Button, Timer  (1) 2024.09.13
STM32 : LED  (0) 2024.09.12
ATmega 128 : CLCD, I2C  (0) 2024.09.10
ATmega 128 : 4-Digit FND 동작 구현  (0) 2024.05.30
ATmega 128 : FND 동작 구현  (0) 2024.05.29