프로그램&회로

STM32 UART

엠칩 2019. 9. 23. 09:37
반응형

인터넷 검색해보면 이것저것 너무나 많이 튀어나와서 사용하기 편리한 예제 찾기가 힘들어서

정리해놓습니다.

 

1. cubeMX에서 UART설정하기

USART포트 사용설정하고, 글로벌 인터럭트 Enable 체크
통신속도 및 데이타 길이 페리지 스톱비트 설정은  연결하는 기기에 맞게 설정.

 

2. cubeMX에서 NVIC설정하기

NVIC 항목에서 Enable체크하고 인터럽트 우선순위 설정해주기... 

 

3. main함수 초기화 하는 부분에서 인터럽트 이네이블 시켜주기

  /* USER CODE BEGIN 2 */
   Initialize( );
   __HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart4, UART_IT_TC);

4. 수신데이타 전역변수로 지정

4-1. main.c파일에서 데이타 선언

/* USER CODE BEGIN PV */
uint8_t rx_data[32];  // 버퍼사이즈는 수신바이트만큼 지정하거나 크게
/* USER CODE END PV */

4-2. stm32XXXXXX_it.c파일에서  상단에 수신버퍼의 extern선언추가.

/* USER CODE BEGIN EV */
extern uint8_t rx_data[32];
/* USER CODE END EV */

 

5. stm32XXXXXX_it.c파일의 IRQHandler 함수에서...
void USART3_6_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_6_IRQn 0 */   /* USER CODE BEGIN USART3_6_IRQn 0 */
  /* USER CODE END USART3_6_IRQn 0 */
  HAL_UART_IRQHandler(&huart4);
  /* USER CODE BEGIN USART3_6_IRQn 1 */

//if((huart4.Instance->ISR & UART_FLAG_RXNE) != RESET) { 
//    // data 수신
//}    ======>> 요부분 삭제
  HAL_UART_Receive_IT(&huart4,&rxtemp,1);
  /* USER CODE END USART3_6_IRQn 1 */
}

// 아래는 새로 추가한 콜백함수... 수신된 데이타를 버퍼에 저장함.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t xtemp;
  if (huart->Instance == USART4)
  { rxDdata[rxdcnt++]=rxtemp;
       if(rxdcnt>=32) {
       rxdcnt=0;
       }
  }
}


  HAL_UART_Receive_IT(&huart4,&rxtemp,1); 이부분에서 수신 바이트를 지정해서 원하는 만큼 한번에 받을 수 있게
  했더니.. 중간 데이타가 깨질 경우 데이타가 밀려 버려서...
  1바이트씩 수신해서.. 버퍼에 저장하게 수정함.

6. 송신은 프로그램 아무곳이나... 

HAL_UART_Transmit_IT(&huart4,tx_data, 7);

송신이 필요할때는 tx_data 변수에 문자열을 넣고

보내고자 하는 데이타 수만 지정해서 함수를 호출하면 됨. (인터럽트 핸들러에 별도 코드가 필요없음)

 

여기까지 하고 실제 송수신을 해보면 1바이트씩 보내고 받을 때마다 인터럽트가 걸리면서 실행됩니다.

해당코드를 어디에 넣어야 할지 모르겠으면 주석처리된 USER CODE를 검색해서 넣으면 됩니다.

반응형

'프로그램&회로' 카테고리의 다른 글

USB-C 1.0 규격  (0) 2019.10.15
STM32F0X0 Flash Programming  (2) 2019.10.01
Terminal V1.9b 2013  (1) 2019.09.06
QMC5883 지자기센서  (0) 2019.01.16
라즈베리파이 전원버튼 추가.  (0) 2018.12.17