J'utilise UART IO basé sur les interruptions (pas de DMA).
HAL_UART_Transmit_IT
la fonction met le EIE
bit dans le CR3
registre. Selon la fiche technique STM32F407 (et le comportement réel), cela génère une interruption uniquement en mode multi-tampon (lorsque le DMAR
bit est défini). EIE
active 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_IRQHandler
fonction:
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_IRQHandler
vérifie chaque erreur. Si une erreur s'est produite et que le EIE
bit est défini, il réinitialise l'état UART, mais ne réinitialise pas les bits d'activation d'interruption, donc l' TXE
interruption sera toujours générée, mais la UART_Transmit_IT
fonction traite l'état HAL_UART_STATE_READY
comme invalide et ne fait rien. Boucle infinie.
Une partie de la UART_Transmit_IT
fonction:
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?
la source
Réponses:
C'est un bug.
J'ai posé la même question sur le forum ST: https://my.st.com/d5c15f59
Ils l'ont confirmé.
la source
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.
la source
HAL_UART_Transmit_IT
etUART_Transmit_IT
sont des fonctions différentes. Le premier ne configure que des interruptions, tandis que le second transmet en fait des données