AnsweredAssumed Answered

CubeMX - UART receive complete interrupt

Question asked by sinitsin.artyom on Jun 5, 2015
Latest reply on Oct 6, 2017 by Tamas Novak
I'm a little bit confusing with question of UART. So, I need to receive data through UART from PC. Ok, as said in stm32f4xx_hal_uart.c file:


     *** Interrupt mode IO operation ***    
     ===================================
     [..]    
       (+) Send an amount of data in non blocking mode using HAL_UART_Transmit_IT()
       (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can
            add his own code by customization of function pointer HAL_UART_TxCpltCallback
       (+) Receive an amount of data in non blocking mode using HAL_UART_Receive_IT()
       (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can
            add his own code by customization of function pointer HAL_UART_RxCpltCallback
       (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can
            add his own code by customization of function pointer HAL_UART_ErrorCallback

this way is also used in examples (UART_Hyperterminal_IT, etc).
Does it means that there are no way to get interrupt on data ready in UART buffer?
Ok, another question. Code in hyperterminal example:

int main(void)
{   
/*hardware configuration*/
     
  if(HAL_UART_Init(&UartHandle) != HAL_OK)
  {
    /* Turn LED3 on: in case of Initialization Error */
    BSP_LED_On(LED3);
    while(1)
    {
    }
  }
   
  /*##-2- Start the transmission process #####################################*/ 
  /* While the UART in reception process, user can transmit data through
     "aTxBuffer" buffer */
  if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxStartMessage, TXSTARTMESSAGESIZE)!= HAL_OK)
  {
    /* Turn LED3 on: Transfer error in transmission process */
    BSP_LED_On(LED3);
    while(1)
    {
    }  
  }
   
  /*##-3- Put UART peripheral in reception process ###########################*/ 
  /* Any data received will be stored "aRxBuffer" buffer : the number max of
     data received is 10 */
  if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    /* Turn LED3 on: Transfer error in reception process */
    BSP_LED_On(LED3);
    while(1)
    {
    }    
  }
 
  /*##-4- Wait for the end of the transfer ###################################*/ 
  /*  Before starting a new communication transfer, you need to check the current  
      state of the peripheral; if it’s busy you need to wait for the end of current
      transfer before starting a new one.
      For simplicity reasons, this example is just waiting till the end of the
      transfer, but application may perform other tasks while transfer operation
      is ongoing. */ 
  while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
  {
  }
  
  /*##-5- Send the received Buffer ###########################################*/ 
  if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aRxBuffer, RXBUFFERSIZE)!= HAL_OK)
  {
    /* Turn LED3 on: Transfer error in transmission process */
    BSP_LED_On(LED3);
    while(1)
    {
    }     
  }
   
  /*##-6- Wait for the end of the transfer ###################################*/ 
  while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
  {
  }
   
  /*##-7- Send the End Message ###############################################*/ 
  if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxEndMessage, TXENDMESSAGESIZE)!= HAL_OK)
  {
    /* Turn LED3 on: Transfer error in transmission process */
    BSP_LED_On(LED3);
    while(1)
    {
    }     
  }
   
  /*##-8- Wait for the end of the transfer ###################################*/ 
  while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
  {
  }
   
  /* Infinite loop */ 
  while (1)
  {
  }
}


Why all this stuff, like HAL_UART_Receive_IT, 
HAL_UART_Transmit_IT, etc. are NOT in last endless while loop? Does this means that I'll receive data only once? If not, does this means that I need call HAL_UART_Receive_IT in loop?

All this question is because previously, in SPL, there was clear interrupt, which invokes at UART events and I could check, if this interrupt is due to receiving.

Outcomes