HAL库串口FE帧错误处理方法

本文探讨了在串口通信中遇到的帧错误(FE)问题,指出当错误处理不当,特别是在EIE中断使能关闭后,可能导致程序陷入死循环。作者提出了解决方案,即简化中断处理函数,直接清除FE标志位,以避免中断无法正常退出。此问题对嵌入式系统和通信协议的稳定性具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在串口被初始化以及开启接收之后,在串口悬空状态下很容易出现FE帧错误,但是HAL对于错误的处理会造成程序陷入死循环,不断进入接收中断。
FE的解释如下:
FE: 帧错误
当一个不同步现象、 强噪声或一个断开符号被检测到的时候, 这个位有硬件置 1。
由软件向 USART_ICR 寄存器的 FECF 位写 1, 可以清除这个标志。 在智能卡模式
中发送数据时, 当重发尝试的次数达到上限, 由没有收到成功的回应(卡一直响应
NACK) 的时候, 这个位也会被硬件置 1。
如果 USART_CR1 寄存器中的 EIE 位是 1, 会产生中断请求。
0: 没有检测到帧错误
1: 有检测到帧错误或者有收到断开字符

中断处理函数:void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)对于帧错误的处理函数如下:

    /* UART frame error interrupt occurred --------------------------------------*/
    if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
    {
      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);

      huart->ErrorCode |= HAL_UART_ERROR_FE;
    }

然后由于其他原因CR3中的EIE被关闭了,但是FE还没来得及清的情况下
((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)的条件就一直不会满足,无法清除标志位等信息,导致不断的进入串口中断,造成CPU卡死现象。

建议解决方法:

if ((isrflags & USART_ISR_FE) != 0U)
{
  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);

  huart->ErrorCode |= HAL_UART_ERROR_FE;
}

直接去除对CR3 EIE数值的判断,直接清除标志位;
其他几个ORE中断等,也可用类似方法解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值