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?
quelle
Antworten:
Es ist ein Fehler.
Ich habe dieselbe Frage im ST-Forum gestellt: https://my.st.com/d5c15f59
Sie haben es bestätigt.
quelle
Haben Sie versucht, die neueste Version von Cube HAL für Ihre MCU herunterzuladen?
Meine HAL_UART_Transmit_IT () -Funktion scheint sich sehr von Ihrer zu unterscheiden. Vielleicht haben Sie eine ältere Version mit Fehlern.
Versuchen Sie, auf st.com zuzugreifen, und suchen Sie nach der neuesten Version von Cube HAL. Im Archiv finden Sie ein Beispiel mit USART.
quelle
HAL_UART_Transmit_IT
undUART_Transmit_IT
sind verschiedene Funktionen. Erstens werden nur Interrupts eingerichtet, während der zweite tatsächlich Daten überträgt