[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机

时间:2022-10-31 19:58:14


起因,由于cx32l003没有DMA功能,所以采取软模串口空闲中断(定时器实现)。
每次串口空闲时,发送信号量给指定线程处理刚刚接收到数据。
处理数据时,需要经过以下操作:

  1. 关闭串口中断,终止串口接收
  2. 处理数据
  3. 打开串口中断,打开串口接收

经过压力测试,发送串口"失灵"了.通过仿真得知,串口接收中断标志位置1,导致一直进入中断服务,无法退出。
通过对官方sdk分析。

CX32L003_HAL_Driver\Src\cx32l003_hal_uart.c

HAL_UART_IRQHandler 中断服务函数

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机


主要把 “&&” 改 “||”.

原因:关闭中断接收,只是关闭[接收完成中断使能],并没有关闭[接收完成中断标志位],第二个无法关闭,硬件控制。这就导致标志位一直无法清除,进入死循环。

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机


解决:只要有接收标志位,就读取缓冲区。

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机

SET_BIT(huart->Instance->SCON, (UART_SCON_REN));

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机

CLEAR_BIT(huart->Instance->SCON, (UART_SCON_REN));

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机


HAL_UART_IRQHandler 中断服务函数加入TX中断判断

else if (((isrflags & UART_INTSR_TI) != RESET))
{
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
}

[单片机][cx32][填坑日记] 对串口uart进行压力测试会死机