STM32串口无法正常中断
1.串口无法中断是由于第一次使用
HAL_UART_Receive_IT(&huart6(uint8_t*)&My_Control.Data.SeriaReceivelData,sizeof(My_Control.Data.SeriaReceivelData));//使能串口接受中断
之后没有在回调函数里再一次使用
2.串口无法使用,观察寄存器
发现RXNE标志位一直为1,数据一直无法读出
原因:
HAL库版本是:STM32Cube_FW_F4_V1.21.0。
发送函数和接收函数中,都出现了 __HAL_LOCK(huart)操作。这实现了对端口的全局加锁。然而,此处却是欠考虑:huart是全双工的,如果APP调用HAL_UART_Transmit_IT在tx操作中执行了 __HAL_LOCK(huart)操作,还没有执行 __HAL_UNLOCK(huart)时发生了rx接收中断,在HAL_UART_RxCpltCallback调用中重新设定HAL_UART_Receive_IT就会出现HAL_BUSY错误。
解决的办法:检查HAL_UART_RxCpltCallback调用中重新设定HAL_UART_Receive_IT的返回值,若出现HAL_BUSY错误,进一步检查huart->RxState是否忙,决定是否重新调用启动接收。
当然,不推荐的做法是简单注释掉HAL库中HAL_UART_Receive_IT加锁语句也能正常工作。