초보의 아웅다웅 설계하기/STM32

HAL_UART_Receive_IT 사용하지 않기

로망와니 2018. 4. 17. 11:36

ST에서 기존 드라이버들에서 Hal 드라이버로 변경한 후 UART 데이터 수신 후 문제가 많았습니다. 물론 틀에 박혀서 사용해야한다는 고정관념 때문이었습니다.

그러다 어떤 분이 올려놓으신 글(당근이)과 아래 사이트를 보면서 아! 꼭 제시해준 방법을 쓰지 않아도 되는구나 기존처럼 사용해도 되는 구나! 하는 것을 알게 되었습니다.

(세상에는 똑똑하신 분들이 많네요. 고정관념 진짜 ㅠㅠ)

 

https://www.basic4mcu.com/bbs/board.php?bo_table=d1&wr_id=40&page=3

 

 

Uart 설정

char Uart1RxData;

 

   /* USART1 */
  Uart1Handle.Instance        = USART1;

  Uart1Handle.Init.BaudRate   = 115200;//Baud Rate
  Uart1Handle.Init.WordLength = UART_WORDLENGTH_8B;
  Uart1Handle.Init.StopBits   = UART_STOPBITS_1;
  Uart1Handle.Init.Parity     = UART_PARITY_NONE;
  Uart1Handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  Uart1Handle.Init.Mode       = UART_MODE_TX_RX;
  Uart1Handle.Init.OverSampling = UART_OVERSAMPLING_16;

    /* GPIO */
  if(HAL_UART_Init(&Uart1Handle) != HAL_OK)
  {
   /* Initialization Error */
  }
  __HAL_UART_ENABLE_IT(&Uart1Handle, UART_IT_RXNE); 

 

 

/* stm32f4xx_hal_msp.c 내용 */

void HAL_UART_MspInit(UART_HandleTypeDef *huart){

  /* Enable GPIO TX/RX clock */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* Enable USARTx clock */
  __HAL_RCC_USART1_CLK_ENABLE();
  
  /*##-2- Configure peripheral GPIO ##########################################*/ 
  /* UART TX GPIO pin configuration  */
  GPIO_InitStruct.Pin       = GPIO_PIN_9;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull      = GPIO_PULLUP;
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* UART RX GPIO pin configuration  */
  GPIO_InitStruct.Pin = GPIO_PIN_10;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
  /*##-3- Configure the NVIC for UART ########################################*/
  /* NVIC for USART */
  HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(USART1_IRQn);

}

 

/* stm32f4xx_it.c 내용 */

 

extern UART_HandleTypeDef Uart1Handle;

extern char Uart1RxData;
void USART1_IRQHandler(void)
{
    if ((__HAL_UART_GET_FLAG(&Uart1Handle, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&Uart1Handle, UART_IT_RXNE) != RESET)) { 
     Uart1RxData = (uint8_t)(Uart1Handle.Instance->DR & (uint8_t)0x00FF);/* STM32FL4 에서는 데이터레지스터인 DR를  변경해주어야 합니다. 저도 보드가 없어서 실테스트를 해보지 못해 못 올리겠네요. 하지만 Instance안에서 수신 데이터 레지스터를 확인해서 넣어주면 될 것 같습니다.  */
    }   
    __HAL_UART_CLEAR_PEFLAG(&Uart1Handle);
//    HAL_UART_IRQHandler(&Uart1Handle); // HAL 드라이버가 제공하는 IRQ 핸들러
}

 

/* 링버퍼를 사용하려면 Uart1RxData 부분을 배열로 받아가면 됩니다. 다만 버퍼 포인터를 증가 및 초기화 해주는 부분이 추가로 필요하겠죠. */