STM32F4 Cube HAL UART. Czy to błąd, czy coś brakuje?

9

Korzystam z UART IO opartego na przerwie (bez DMA).

HAL_UART_Transmit_ITfunkcja ustawia EIEbit w CR3rejestrze. Zgodnie z arkuszem danych STM32F407 (i rzeczywistym zachowaniem) powoduje to przerwanie tylko w trybie wielu buforów (gdy DMARbit jest ustawiony). EIEwłącza generowanie przerwań dla błędu ramki ( FE), błędu przekroczenia ( ORE), błędu szumu ( NE). Ten błąd, jak rozumiem, tylko do odbioru.

Część HAL_UART_IRQHandlerfunkcji:

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_IRQHandlersprawdza każdy błąd. Jeśli wystąpi błąd i EIEbit zostanie ustawiony, resetuje on stan UART, ale nie resetuje bitów włączających przerwanie, więc TXEprzerwanie będzie zawsze generowane, ale UART_Transmit_ITfunkcja traktuje stan HAL_UART_STATE_READYjako nieprawidłowy i nic nie robi. Nieskończona pętla.

Część UART_Transmit_ITfunkcji:

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

Czy to błąd w Cube HAL?

rublag
źródło
trzy i pół roku później i to wciąż stanowi problem
8908459

Odpowiedzi:

4

To jest błąd.

Zadałem to samo pytanie na forum ST: https://my.st.com/d5c15f59

Potwierdzili to.

rublag
źródło
Link „my.st.com” wymaga logowania. Znalazłem ten wątek na forum ST, który moim zdaniem jest zgłaszaniem tego problemu i jest dostępny bez logowania, więc czytelnicy mogą uznać to za przydatne.
SamGibson,
0

Czy próbowałeś pobrać najnowszą wersję Cube HAL dla swojego MCU?

Moja funkcja HAL_UART_Transmit_IT () wydaje się bardzo różna od twojej. Może masz starszą wersję z błędami.

Spróbuj wejść na st.com i wyszukaj najnowszą wersję Cube HAL. W archiwum znajdziesz przykład z USART.

Gabriel Rezende Germanovix
źródło
HAL_UART_Transmit_ITi UART_Transmit_ITsą różnymi funkcjami. Pierwszy tylko konfiguruje przerwania, a drugi faktycznie przesyła dane
rublag
Tak, ale wiesz, że druga funkcja może być wywołana tylko przez inną funkcję HAL, a nie bezpośrednio przez użytkownika? I po prostu otwieram moje pliki źródłowe HAL i znajduję UART_Transmit_IT i jest inny niż część, którą wklejasz powyżej. Inną opcją, jeśli nadal uważasz, że jest błąd, jest napisanie tego samego pytania na st forum.
Gabriel Rezende Germanovix,