cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F7 crash on HAL_UART_Transmit

PierreG-S
Associate II

Hello,

 

My STM32F7 crash after Reinit the UART :

 

- I have an UART for my RS232, and I can communicate to 2 devices by this RS232. So the customers choose on which device he want to send data, then I configure internals variables and the UART baudrate and flow control.

 

- So I use the next fonction to reinit my UART :

 

void RS232_Link_USART1_UART_ReInit(uint32_t BaudRate, uint32_t FlowCtrl)
{
  HAL_UART_Abort_IT(&huart1);

  HAL_UART_DeInit(&huart1);

  huart1.Init.BaudRate = BaudRate;
  huart1.Init.HwFlowCtl = FlowCtrl;

  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

  uint8_t buff;
  if (HAL_UART_Receive_IT(&huart1, &buff, 1) != HAL_OK) {
      Error_Handler();
  }
}

 

 

 - This code works for 1 device but not for the other device. The thing that change is that the device which occure the crash send datas back after a transmit but we don't treat them. If I comment the part "HAL_UART_Receive_IT" it works, but I want to resolve the problem because it can maybe happen with the other device.

 

- Then the STM32 crash in the function :

 

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  const uint8_t  *pdata8bits;
  const uint16_t *pdata16bits;
  uint32_t tickstart;

  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return  HAL_ERROR;
    }

    __HAL_LOCK(huart);

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Init tickstart for timeout management */
    tickstart = HAL_GetTick();

    huart->TxXferSize  = Size;
    huart->TxXferCount = Size;

    /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      pdata8bits  = NULL;
      pdata16bits = (const uint16_t *) pData;
    }
    else
    {
      pdata8bits  = pData;
      pdata16bits = NULL;
    }

    __HAL_UNLOCK(huart);

    while (huart->TxXferCount > 0U)
    {
      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
      {
        return HAL_TIMEOUT;
      }
      if (pdata8bits == NULL)
      {
        huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
        pdata16bits++;
      }
      else
      {
        huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
        pdata8bits++;
      }
      huart->TxXferCount--;
    }

    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
    {
      return HAL_TIMEOUT;
    }

    /* At end of Tx process, restore huart->gState to Ready */
    huart->gState = HAL_UART_STATE_READY;

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

 

 at this instruction :

 

huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);

 

 

 I dertermined that the problem is the variable "pdata8bits" but I don't know what's happening...

 

Thanks

1 ACCEPTED SOLUTION

Accepted Solutions
PierreG-S
Associate II

Ok I found, just a buffer error about the :

uint8_t buff;
if (HAL_UART_Receive_IT(&huart1, &buff, 1) != HAL_OK)

 

View solution in original post

1 REPLY 1
PierreG-S
Associate II

Ok I found, just a buffer error about the :

uint8_t buff;
if (HAL_UART_Receive_IT(&huart1, &buff, 1) != HAL_OK)