Ich verwende Interrupt-basiertes UART IO (kein DMA).
HAL_UART_Transmit_IT
Funktion setzt EIE
Bit im CR3
Register. Laut STM32F407-Datenblatt (und realem Verhalten) wird dadurch nur im Mehrpuffermodus (wenn das DMAR
Bit gesetzt ist) ein Interrupt erzeugt . EIE
Aktiviert die Interrupt-Generierung für Frame Error ( FE
), Overrun Error ( ORE
), Noise Error ( NE
). Dieser Fehler dient meines Wissens nur zum Empfangen.
Teil der HAL_UART_IRQHandler
Funktion:
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
prüft auf jeden Fehler. Wenn ein Fehler aufgetreten ist und das EIE
Bit gesetzt ist, wird der UART-Status zurückgesetzt, die Interrupt-Aktivierungsbits werden jedoch nicht zurückgesetzt, sodass immer ein TXE
Interrupt generiert wird. Die UART_Transmit_IT
Funktion behandelt den Status jedoch HAL_UART_STATE_READY
als ungültig und führt nichts aus. Endlosschleife.
Teil der UART_Transmit_IT
Funktion:
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;
}
}
Ist es ein Fehler in Cube HAL?