Tôi đang sử dụng UART IO dựa trên ngắt (không có DMA).
HAL_UART_Transmit_ITHàm đặt EIEbit trong CR3thanh ghi. Theo biểu dữ liệu STM32F407 (và hành vi thực), điều này chỉ tạo ra ngắt trong chế độ đa bộ đệm (khi DMARbit được đặt). EIEcho phép tạo ngắt cho lỗi khung ( FE), lỗi tràn ( ORE), lỗi nhiễu ( NE). Lỗi này, theo tôi hiểu, chỉ để nhận.
Một phần của HAL_UART_IRQHandlerchức năng:
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_IRQHandlerkiểm tra từng lỗi. Nếu xảy ra lỗi và EIEbit được đặt, nó sẽ thiết lập lại trạng thái UART, nhưng không thiết lập lại các bit cho phép ngắt, do đó, TXEngắt sẽ luôn được tạo, nhưng UART_Transmit_ITchức năng coi trạng thái HAL_UART_STATE_READYlà không hợp lệ và không làm gì cả. Vòng lặp vô hạn.
Một phần của UART_Transmit_ITchức năng:
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;
}
}
Có phải là một lỗi trong Cube HAL?