Cubo STM32F4 HAL UART. É um bug ou estou faltando alguma coisa?


9

Estou usando UART IO baseado em interrupção (sem DMA).

HAL_UART_Transmit_ITA função define o EIEbit no CR3registro. De acordo com a folha de dados do STM32F407 (e comportamento real), isso gera interrupção apenas no modo de buffer múltiplo (quando o DMARbit está definido). EIEativa a geração de interrupção para erro de quadro ( FE), erro de saturação ( ORE), erro de ruído ( NE). Este erro, pelo que entendi, apenas para receber.

Parte da HAL_UART_IRQHandlerfunção:

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_IRQHandlerverifica cada erro. Se o erro ocorreu e o EIEbit está definido, ele redefine o estado UART, mas não redefine os bits de ativação de interrupção, portanto a TXEinterrupção será sempre gerada, mas a UART_Transmit_ITfunção trata o estado HAL_UART_STATE_READYcomo inválido e não faz nada. Loop infinito.

Parte da UART_Transmit_ITfunção:

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;
  }
}

É um bug no Cube HAL?


três anos e meio depois e isso ainda é um problema #
user8908459 17/05/19

Respostas:


4

Isso é um bug.

Fiz a mesma pergunta no fórum ST: https://my.st.com/d5c15f59

Eles confirmaram isso.


O link "my.st.com" requer um login. Eu encontrei este tópico no fórum ST, que acho que é o relatório desse problema e está acessível sem um login, para que os leitores possam achar isso útil.
21416 SamGibson

0

Você tentou baixar a versão mais recente do Cube HAL para o seu MCU?

Minha função HAL_UART_Transmit_IT () parece muito diferente da sua. Talvez você tenha uma versão mais antiga com erros.

Tente acessar st.com e procure a versão mais recente do Cube HAL. Dentro do arquivo, você encontrará alguns exemplos com o USART.


HAL_UART_Transmit_ITe UART_Transmit_ITsão funções diferentes. Primeiro apenas estabelece-se interrupções, enquanto o segundo realmente transmite dados
rublag

Sim, mas você sabe que a segunda função só pode ser chamada por outra função HAL e não direta pelo usuário? E eu apenas abro meus arquivos de origem HAL e encontro UART_Transmit_IT e é diferente da parte que você cola acima. Outra opção, se você ainda acha que existe um erro, é escrever a mesma pergunta no fórum.
Gabriel Rezende Germanovix
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.