Saya menggunakan UART IO berbasis interupsi (tanpa DMA).
HAL_UART_Transmit_ITfungsi mengatur EIEbit dalam CR3register. Menurut datasheet STM32F407 (dan perilaku nyata), ini menghasilkan interupsi hanya dalam mode multi buffer (ketika DMARbit diatur). EIEmemungkinkan 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_IRQHandlerfungsi:
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_IRQHandlermemeriksa setiap kesalahan. Jika kesalahan terjadi dan EIEbit diset, bit ini akan mengatur ulang keadaan UART, tetapi tidak mengatur ulang bit yang memungkinkan interupsi, jadi TXEinterupsi akan selalu dihasilkan, tetapi UART_Transmit_ITfungsi memperlakukan status HAL_UART_STATE_READYsebagai tidak valid dan tidak melakukan apa-apa. Loop tak terbatas.
Bagian dari UART_Transmit_ITfungsi:
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?