我正在使用基于中断的UART IO(无DMA)。
HAL_UART_Transmit_IT
功能设置寄存器中的EIE
位CR3
。根据STM32F407数据表(以及实际行为),这仅在多缓冲区模式下(当DMAR
位置1 时)产生中断。EIE
使能针对帧错误(FE
),溢出错误(ORE
),噪声错误(NE
)的中断生成。据我了解,此错误仅用于接收。
部分HAL_UART_IRQHandler
功能:
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
检查每个错误。如果发生错误并置EIE
位,它将重置UART状态,但不重置中断使能位,因此TXE
将始终生成中断,但是UART_Transmit_IT
函数将状态HAL_UART_STATE_READY
视为无效并且不执行任何操作。无限循环。
部分UART_Transmit_IT
功能:
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;
}
}
这是Cube HAL中的错误吗?
三年半之后,这仍然是一个问题
—
user8908459 '19