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?