STM32F4 Cube HAL UART. Est-ce un bug ou est-ce que je manque quelque chose?

9

J'utilise UART IO basé sur les interruptions (pas de DMA).

HAL_UART_Transmit_ITla fonction met le EIEbit dans le CR3registre. Selon la fiche technique STM32F407 (et le comportement réel), cela génère une interruption uniquement en mode multi-tampon (lorsque le DMARbit est défini). EIEactive la génération d'interruption pour l'erreur de trame ( FE), l'erreur de dépassement ( ORE), l'erreur de bruit ( NE). Cette erreur, si je comprends bien, uniquement pour la réception.

Une partie de la HAL_UART_IRQHandlerfonction:

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_IRQHandlervérifie chaque erreur. Si une erreur s'est produite et que le EIEbit est défini, il réinitialise l'état UART, mais ne réinitialise pas les bits d'activation d'interruption, donc l' TXEinterruption sera toujours générée, mais la UART_Transmit_ITfonction traite l'état HAL_UART_STATE_READYcomme invalide et ne fait rien. Boucle infinie.

Une partie de la UART_Transmit_ITfonction:

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

Est-ce un bug dans Cube HAL?

rublag
la source
trois ans et demi plus tard et c'est toujours un problème
user8908459

Réponses:

4

C'est un bug.

J'ai posé la même question sur le forum ST: https://my.st.com/d5c15f59

Ils l'ont confirmé.

rublag
la source
Le lien "my.st.com" nécessite une connexion. J'ai trouvé ce fil sur le forum ST, qui je pense est le signalement de ce problème, et est accessible sans connexion, donc les lecteurs peuvent trouver cela utile.
SamGibson
0

Avez-vous essayé de télécharger la dernière version de Cube HAL pour votre MCU?

Ma fonction HAL_UART_Transmit_IT () semble très différente de la vôtre. Peut-être que vous avez une ancienne version avec des bugs.

Essayez d'accéder à st.com et recherchez la dernière version de Cube HAL. Dans l'archive, vous trouverez un exemple avec USART.

Gabriel Rezende Germanovix
la source
HAL_UART_Transmit_ITet UART_Transmit_ITsont des fonctions différentes. Le premier ne configure que des interruptions, tandis que le second transmet en fait des données
rublag
Oui, mais vous savez que la deuxième fonction ne peut être appelée que par une autre fonction HAL et non directement par l'utilisateur? Et je viens d'ouvrir mes fichiers source HAL et de trouver UART_Transmit_IT et son différent de la partie que vous collez ci-dessus. Une autre option si vous pensez toujours qu'il y a un bug est d'écrire la même question sur st forum.
Gabriel Rezende Germanovix