Korzystam z UART IO opartego na przerwie (bez DMA).
HAL_UART_Transmit_IT
funkcja ustawia EIE
bit w CR3
rejestrze. Zgodnie z arkuszem danych STM32F407 (i rzeczywistym zachowaniem) powoduje to przerwanie tylko w trybie wielu buforów (gdy DMAR
bit jest ustawiony). EIE
włącza generowanie przerwań dla błędu ramki ( FE
), błędu przekroczenia ( ORE
), błędu szumu ( NE
). Ten błąd, jak rozumiem, tylko do odbioru.
Część HAL_UART_IRQHandler
funkcji:
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
sprawdza każdy błąd. Jeśli wystąpi błąd i EIE
bit zostanie ustawiony, resetuje on stan UART, ale nie resetuje bitów włączających przerwanie, więc TXE
przerwanie będzie zawsze generowane, ale UART_Transmit_IT
funkcja traktuje stan HAL_UART_STATE_READY
jako nieprawidłowy i nic nie robi. Nieskończona pętla.
Część UART_Transmit_IT
funkcji:
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;
}
}
Czy to błąd w Cube HAL?
źródło
Odpowiedzi:
To jest błąd.
Zadałem to samo pytanie na forum ST: https://my.st.com/d5c15f59
Potwierdzili to.
źródło
Czy próbowałeś pobrać najnowszą wersję Cube HAL dla swojego MCU?
Moja funkcja HAL_UART_Transmit_IT () wydaje się bardzo różna od twojej. Może masz starszą wersję z błędami.
Spróbuj wejść na st.com i wyszukaj najnowszą wersję Cube HAL. W archiwum znajdziesz przykład z USART.
źródło
HAL_UART_Transmit_IT
iUART_Transmit_IT
są różnymi funkcjami. Pierwszy tylko konfiguruje przerwania, a drugi faktycznie przesyła dane