STM32串口使用问题-使用一段时间无法接收
参考这个文章
https://blog.csdn.net/mickey35/article/details/78529637
串口接收时出现错误,进入错误回调程序,没有再启动HAL_UART_Receive_IT(huart,(u8 *)&i,1);接收一字节,串口再也无法进入接收中断,那怕在主程序中使用HAL_UART_Receive_IT(huart,(u8 )&i,1)。
先开启/ 开启接收错误中断 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
添加错误处理回调
void HAL_UART_ErrorCallback(UART_HandleTypeDef huart)
{
/ Prevent unused argument(s) compilation warning */
UNUSED(huart);
uint8_t i = 0;
uint32_t isrflags = READ_REG(huart->Instance->SR);//手册上有讲,清错误都要先读SR
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
{
READ_REG(huart->Instance->DR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_PE);//清标志
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
{
READ_REG(huart->Instance->DR);//FE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_FE);
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
{
READ_REG(huart->Instance->DR);//NE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_NE);
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
{
READ_REG(huart->Instance->CR1);//ORE清标志,第二步读CR
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE);
}
if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(huart);
HAL_UART_Receive_IT(huart,(u8 *)&i,1);
}
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_ErrorCallback could be implemented in the user file
*/
}
HAL存在错误回调函数,__weak表示编译器不关心这个函数,不会被编译。
__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)