Cubo STM32F4 HAL UART. È un bug o mi sto perdendo qualcosa?


9

Sto usando UART IO di interrupt (no DMA).

HAL_UART_Transmit_ITla funzione imposta il EIEbit nel CR3registro. Secondo il datasheet STM32F407 (e il comportamento reale), questo genera interrupt solo in modalità multi buffer (quando il DMARbit è impostato). EIEabilita la generazione di interruzioni per errore frame ( FE), errore overrun ( ORE), noise noise ( NE). Questo errore, a quanto ho capito, solo per la ricezione.

Parte della HAL_UART_IRQHandlerfunzione:

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_IRQHandlercontrolla ogni errore. Se si è verificato un errore e il EIEbit è impostato, reimposta lo stato UART, ma non reimposta i bit di abilitazione dell'interrupt, quindi l' TXEinterrupt verrà sempre generato, ma la UART_Transmit_ITfunzione considera lo stato HAL_UART_STATE_READYcome non valido e non fa nulla. Ciclo infinito.

Parte della UART_Transmit_ITfunzione:

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

È un bug in Cube HAL?


tre anni e mezzo dopo e questo è ancora un problema
user8908459,

Risposte:


4

È un bug.

Ho fatto la stessa domanda sul forum ST: https://my.st.com/d5c15f59

Lo hanno confermato.


Il link "my.st.com" richiede un accesso. Ho trovato questa discussione sul forum ST, che penso sia la segnalazione di questo problema, ed è accessibile senza un login, quindi i lettori potrebbero trovarlo utile.
SamGibson,

0

Hai provato a scaricare l'ultima versione di Cube HAL per il tuo MCU?

La mia funzione HAL_UART_Transmit_IT () sembra molto diversa dalla tua. Forse hai una versione precedente con bug.

Prova ad accedere a st.com e cerca l'ultima versione di Cube HAL. All'interno dell'archivio troverai alcuni esempi con USART.


HAL_UART_Transmit_ITe UART_Transmit_ITsono diverse funzioni. Il primo imposta solo gli interrupt, mentre il secondo trasmette effettivamente i dati
ripubblicare il

Sì, ma sai che la seconda funzione può essere chiamata solo da un'altra funzione HAL non diretta dall'utente? E apro solo i miei file sorgente HAL e trovo UART_Transmit_IT ed è diverso dalla parte che incolla sopra. Un'altra opzione se pensi ancora che ci sia un bug è scrivere la stessa domanda sul forum di st.
Gabriel Rezende Germanovix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.