起因,由于cx32l003没有DMA功能,所以采取软模串口空闲中断(定时器实现)。
每次串口空闲时,发送信号量给指定线程处理刚刚接收到数据。
处理数据时,需要经过以下操作:
- 关闭串口中断,终止串口接收
- 处理数据
- 打开串口中断,打开串口接收
经过压力测试,发送串口"失灵"了.通过仿真得知,串口接收中断标志位置1,导致一直进入中断服务,无法退出。
通过对官方sdk分析。
CX32L003_HAL_Driver\Src\cx32l003_hal_uart.c
HAL_UART_IRQHandler 中断服务函数
主要把 “&&” 改 “||”.
原因:关闭中断接收,只是关闭[接收完成中断使能],并没有关闭[接收完成中断标志位],第二个无法关闭,硬件控制。这就导致标志位一直无法清除,进入死循环。
解决:只要有接收标志位,就读取缓冲区。
SET_BIT(huart->Instance->SCON, (UART_SCON_REN));
CLEAR_BIT(huart->Instance->SCON, (UART_SCON_REN));
HAL_UART_IRQHandler 中断服务函数加入TX中断判断