Saya menggunakan UART IO berbasis interupsi (tanpa DMA).
HAL_UART_Transmit_IT
fungsi mengatur EIE
bit dalam CR3
register. Menurut datasheet STM32F407 (dan perilaku nyata), ini menghasilkan interupsi hanya dalam mode multi buffer (ketika DMAR
bit diatur). EIE
memungkinkan pembangkitan interupsi untuk kesalahan bingkai ( FE
), kesalahan overrun ( ORE
), kesalahan noise ( NE
). Kesalahan ini, seperti yang saya mengerti, hanya untuk menerima.
Bagian dari HAL_UART_IRQHandler
fungsi:
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
memeriksa setiap kesalahan. Jika kesalahan terjadi dan EIE
bit diset, bit ini akan mengatur ulang keadaan UART, tetapi tidak mengatur ulang bit yang memungkinkan interupsi, jadi TXE
interupsi akan selalu dihasilkan, tetapi UART_Transmit_IT
fungsi memperlakukan status HAL_UART_STATE_READY
sebagai tidak valid dan tidak melakukan apa-apa. Loop tak terbatas.
Bagian dari UART_Transmit_IT
fungsi:
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;
}
}
Apakah ini bug di Cube HAL?