STM32F4 Würfel HAL UART. Ist es ein Fehler oder fehlt mir etwas?

9

Ich verwende Interrupt-basiertes UART IO (kein DMA).

HAL_UART_Transmit_ITFunktion setzt EIEBit im CR3Register. Laut STM32F407-Datenblatt (und realem Verhalten) wird dadurch nur im Mehrpuffermodus (wenn das DMARBit gesetzt ist) ein Interrupt erzeugt . EIEAktiviert die Interrupt-Generierung für Frame Error ( FE), Overrun Error ( ORE), Noise Error ( NE). Dieser Fehler dient meines Wissens nur zum Empfangen.

Teil der HAL_UART_IRQHandlerFunktion:

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_IRQHandlerprüft auf jeden Fehler. Wenn ein Fehler aufgetreten ist und das EIEBit gesetzt ist, wird der UART-Status zurückgesetzt, die Interrupt-Aktivierungsbits werden jedoch nicht zurückgesetzt, sodass immer ein TXEInterrupt generiert wird. Die UART_Transmit_ITFunktion behandelt den Status jedoch HAL_UART_STATE_READYals ungültig und führt nichts aus. Endlosschleife.

Teil der UART_Transmit_ITFunktion:

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

Ist es ein Fehler in Cube HAL?

rublag
quelle
dreieinhalb Jahre später und dies ist immer noch ein Problem
user8908459

Antworten:

4

Es ist ein Fehler.

Ich habe dieselbe Frage im ST-Forum gestellt: https://my.st.com/d5c15f59

Sie haben es bestätigt.

rublag
quelle
Der Link "my.st.com" erfordert eine Anmeldung. Ich habe diesen Thread im ST-Forum gefunden, der meiner Meinung nach die Meldung dieses Problems darstellt und ohne Anmeldung zugänglich ist, sodass Leser dies möglicherweise nützlich finden.
SamGibson
0

Haben Sie versucht, die neueste Version von Cube HAL für Ihre MCU herunterzuladen?

Meine HAL_UART_Transmit_IT () -Funktion scheint sich sehr von Ihrer zu unterscheiden. Vielleicht haben Sie eine ältere Version mit Fehlern.

Versuchen Sie, auf st.com zuzugreifen, und suchen Sie nach der neuesten Version von Cube HAL. Im Archiv finden Sie ein Beispiel mit USART.

Gabriel Rezende Germanovix
quelle
HAL_UART_Transmit_ITund UART_Transmit_ITsind verschiedene Funktionen. Erstens werden nur Interrupts eingerichtet, während der zweite tatsächlich Daten überträgt
Rublag
Ja, aber Sie wissen, dass die zweite Funktion nur von einer anderen HAL-Funktion aufgerufen werden kann, nicht direkt vom Benutzer? Und ich öffne einfach meine HAL-Quelldateien und finde UART_Transmit_IT und es unterscheidet sich von dem Teil, den Sie oben einfügen. Eine andere Möglichkeit, wenn Sie immer noch glauben, dass es einen Fehler gibt, besteht darin, dieselbe Frage im st Forum zu schreiben.
Gabriel Rezende Germanovix