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?