首先,在STM32CUBE里,将UART2设置为全局中断
其次,使能RXNE中断和ORE中断,main.c中的代码如下:
void main(void)
{
...
if(HAL_UART_Receive_IT(&huart2,(u8 *)&i,1) != HAL_OK) Error_Handler();
/* 开启接收错误中断 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
...
}
接着,在usart.c中加入串口错误中断回调函数的定义:
/* 中断错误处理函数,在此处理overrun错误 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
uint8_t i = 0;
if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(huart);
HAL_UART_Receive_IT(huart,(u8 *)&i,1);
}
}
单纯处理溢出中断的话,这样就可以了;如果想处理其他一些错误,比如帧错误等等,就继续判断标志位;如果想在检测到错误之后做一些处理,也可以写在回调函数里。