STM32F4 Cube HAL UART. Это ошибка или я что-то упустил?

9

Я использую прерывание на основе UART IO (без DMA).

HAL_UART_Transmit_ITфункция устанавливает EIEбит в CR3регистре. В соответствии с таблицей данных STM32F407 (и реальным поведением), это генерирует прерывание только в многобуферном режиме (когда DMARбит установлен). EIEпозволяет генерировать прерывания для ошибки кадра ( FE), ошибки переполнения ( ORE), ошибки шума ( NE). Эта ошибка, как я понимаю, только для получения.

Часть HAL_UART_IRQHandlerфункции:

tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);
tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
/* UART Over-Run interrupt occurred ----------------------------------------*/
if((tmp1 != RESET) && (tmp2 != RESET))
{ 
  __HAL_UART_CLEAR_OREFLAG(huart);

  huart->ErrorCode |= HAL_UART_ERROR_ORE;
}

if(huart->ErrorCode != HAL_UART_ERROR_NONE)
{
  /* Set the UART state ready to be able to start again the process */
  huart->State = HAL_UART_STATE_READY;

  HAL_UART_ErrorCallback(huart);
}  

HAL_UART_IRQHandlerпроверяет каждую ошибку. Если произошла ошибка и EIEбит установлен, он сбрасывает состояние UART, но не сбрасывает биты разрешения прерываний, поэтому TXEпрерывание будет всегда генерироваться, но UART_Transmit_ITфункция обрабатывает состояние HAL_UART_STATE_READYкак недействительное и ничего не делает. Бесконечный цикл.

Часть UART_Transmit_ITфункции:

static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
  {
  uint16_t* tmp;
  uint32_t tmp1 = 0;

  tmp1 = huart->State;
  if((tmp1 == HAL_UART_STATE_BUSY_TX) || (tmp1 == HAL_UART_STATE_BUSY_TX_RX))
  {
  }
  else
  {
    return HAL_BUSY;
  }
}

Это ошибка в Cube HAL?

rublag
источник
три с половиной года спустя, и это все еще проблема
user8908459

Ответы:

4

Это ошибка.

Я задал тот же вопрос на форуме ST: https://my.st.com/d5c15f59

Они подтвердили это.

rublag
источник
Ссылка "my.st.com" требует входа в систему. Я нашел эту ветку на форуме ST, которая, как мне кажется, сообщает об этой проблеме и доступна без входа в систему, так что читатели могут найти это полезным.
СамГибсон
0

Вы пытались загрузить последнюю версию Cube HAL для своего MCU?

Моя функция HAL_UART_Transmit_IT (), кажется, сильно отличается от вашей. Может быть, у вас есть старая версия с ошибками.

Попробуйте зайти на st.com и найти последнюю версию Cube HAL. Внутри архива вы найдете несколько примеров с USART.

Габриэль Резенде Германовикс
источник
HAL_UART_Transmit_ITи UART_Transmit_ITразные функции. Первый только устанавливает прерывания, а второй фактически передает данные
rublag
Да, но вы знаете, что вторая функция может вызываться только другой функцией HAL, а не напрямую пользователем? И я просто открываю свои исходные файлы HAL и нахожу UART_Transmit_IT, и он отличается от той части, которую вы вставили выше. Другой вариант, если вы все еще думаете, что есть ошибка - написать тот же вопрос на форуме.
Габриэль Резенде Германовикс