Tôi đang sử dụng UART IO dựa trên ngắt (không có DMA).
HAL_UART_Transmit_IT
Hàm đặt EIE
bit trong CR3
thanh 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 DMAR
bit được đặt). EIE
cho 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_IRQHandler
chứ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_IRQHandler
kiểm tra từng lỗi. Nếu xảy ra lỗi và EIE
bit đượ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 đó, TXE
ngắt sẽ luôn được tạo, nhưng UART_Transmit_IT
chức năng coi trạng thái HAL_UART_STATE_READY
là 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_IT
chứ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?