1 분 소요

자료 설명


  1. UART (비동기식) USART(동기식)

Uart (Universal Sync/Async Receiver Transmitter) 범용 동기 송수신기

데이터를 보낼떄 동기 또는 비동기식으로 전달

동기는 클럭과 동기 맞춰서 전달

비동기식은 시간 관격으로 조절하면 Baudrate 을 일치해야 한다

주로 디버깅 용도로 사용한다

Uart 영상 자료

2개의 선만 이용해서 통신이 가능하다

UART 표시할때

8-N-9600-1 8비트 통신 - Parity 비트

보드 스펙

보드에서는 UART 기능 이용해서 사용이 가능하다

UART 설정

소스코드


HAL_UART_Transmit(UART 주소, 전달 변수, 변수 크기, 딜레이)

  uint8_t a = 'a';
  while (1)
  {

	  if(HAL_UART_Receive(&huart3, &a, 1, 10) == HAL_OK)
	  {
		  HAL_UART_Transmit(&huart3, &a, 1, 10);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

Pirntf 사용하기


  1. 표준 입력 함수 추가하기
  • #include “stdio.h” 추가
  1. printf() 함수 출력 대상을 리데렉션하기
  • Private user code – 위치에
    int _write(int file, char* p, int len)
    {
      HAL_UART_Transmit(&huart3, p, len, 10);
      return len;
    }
    

참고

printf 시 float 형식 사용할려면 -u _printf_float 을 설정해야한다

프로젝트 트리 - 우측클릭 - 특성 -

  • Tool Setting - C_linker - Miscellaneous - Other options u _printf_float 입력해준다

float 세팅 방법

참고 2

printf 가 무거운데 tiny_printf 사용할수 있다 프로젝트 우클릭 - 새 프로젝트 - 기타 - library function 에서 사용가능하다

UART Interrupt 사용하기


  1. UART 사용 포트에 NVIC 기능을 켜준다.
    • NVIC (Nested Vector Interrupt Controller)
  2. 환경설정을 하는데 init 기능을 켜준다

UART interrupt 기능

코드 부분

  1. 유저코드에 아래 코드를 추가해준다. 간단하게 설명하자면 해당 코드는 UART 콜백 함수로 인터럽트 발생시 실행되는 함수이다. 기존에 __weak 앞에 붙어있어서 다른 함수에서 호출해서 쓸수 있게 설계된 함수이다. -> 해당 내용은 정확하지 않음 영상 자료 보고 판단해주세요 ```c uint8_t rx3_data;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart) { / Prevent unused argument(s) compilation warning / if(huart->Instance == USART3) { HAL_UART_Receive_IT(&huart3, &rx3_data, 1); HAL_UART_Transmit(&huart3, &rx3_data, 1 ,10); } / NOTE : This function should not be modified, when the callback is needed, the HAL_UART_RxCpltCallback can be implemented in the user file. */ }

  1. 사용자 함수 시작전 해당 인터럽트 호출 미리 해준다
 HAL_UART_Receive_IT(&huart3,&rx3_data,1);

추가 자료

  1. 배열에 크기를 변경하여 인터럽트를 발생하게 할 수도 있다.
uint8_t rx3_data[10];

if(huart->Instance == USART3)
{
	HAL_UART_Receive_IT(&huart3, &rx3_data, 10);
	HAL_UART_Transmit(&huart3, &rx3_data, 10 ,10);
}
  1. 다른 코드에서는 인터럽트 발생시 넣는 방식도 있다. (참고용 - 현재 보드에서는 동작하지 않음)

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint8_t rx_ch = (unsigned char) (huart1.Instance->DR & (uint8_t) 0x00FF);
	arr[arr_idx++] = rx_ch;
	if (arr[arr_idx-1] == ';')
	{
		gUartOk = true;
     }

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

출처

  1. 참고 양상강의 자료 https://www.youtube.com/watch?v=_7Ll95FITn4&list=PLUaCOzp6U-RqMo-QEJQOkVOl1Us8BNgXk&index=4&ab_channel=ChrisWonyeobPark

  2. 인터럽트 관련 참고 자료 https://how-to-make-a-quadcopter.tistory.com/24

태그:

카테고리:

업데이트:

댓글남기기