STM32长时间工作后串口不能接收

问题:记录一次STM32长时间工作后,串口不能正常接收数据,其他功能正常。
场景简单描述:在某一个产品上STM32作为前面板的控制,有多个中断开启,大部分的中断级别为0,串口的中断级别为1,串口中断接收,普通方式发送。出现长时间工作之后串口不能接收,但能正常发送数据。
问题分析

  1. 应该是串口接收的时候出现异常(溢出,因为串口中断接收的级别比较低,可能被其他的高优先级中断打断),STM32 HAL库的异常处理是没有有影响,晚上的例子是会不断进入中断
  2. 串口出现接收出现忙碌

针对第一个问题,在错误处理中断中加入溢出处理

HAL_StatusTypeDef g_RxStatus = 0;
void HAL_UART_RxCpltCallback( UART_HandleTypeDef* huart ) //¶¨Òå USART1 ½ÓÊÕÍê³É»Øµ÷º¯Êý¹¦ÄÜ
{
    /* Prevent unused argument(s) compilation warning */
    // UNUSED(huart);
    /* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
    // Check if there's space. Put received char in buffer.
    if( ringBufferPut( &g_UartRxBuffer, m_RecvChar ) == FALSE )
   {
       // no space in buffer, increment overflow counter
       m_UartRxOverflow++;
       ringBufferReset( &g_UartRxBuffer );
   }

    g_RxStatus = HAL_UART_Receive_IT( &huart1, &m_RecvChar, 1 );

    PDEBUGE( "uart rx status = %d\n", status );
}

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    /* Prevent unused argument(s) compilation warning */
    // UNUSED(huart);
    /* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_ErrorCallback could be implemented in the user file
*/
    if( huart->ErrorCode & HAL_UART_ERROR_ORE )//Overflow error
   {
       uint32_t temp = huart->Instance->SR;
       temp = huart->Instance->DR;
   }
}

针对串口忙碌,增加返回值判断,如果忙碌定时10ms重新检查

void CTRLCOM_CheckRxBusy()
{
   if( g_RxStatus == HAL_BUSY )
	 {
			g_RxStatus = HAL_UART_Receive_IT( &huart1, &m_RecvChar, 1 );
	 }
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值