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

在串口被初始化以及开启接收之后,在串口悬空状态下很容易出现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中断等,也可用类似方法解决

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用HAL库进行串口接收处理时,处理尾是一种常见的方法,以确保接收到的数据是完整的数据。 首先,需要设置一个合适的头和尾,它们可以是一个特定的字节或者是一个特定的字节序列。头和尾的作用是标识一数据的开始和结束位置。 在接收数据时,可以使用一个缓冲区来逐个字节地接收数据,并进行判断。可以使用一个状态机来处理接收过程,状态机可以包含几个状态,如等待头、接收数据、校验等等。 在等待头的状态下,不断接收数据,并与头进行比对,一旦匹配成功,就进入接收数据的状态。在接收数据的状态下,可以将接收到的数据依次存储到缓冲区中。 在接收数据过程中,可以增加一些校验,比如计算校验和或者使用CRC校验,来验证接收数据的完整性。 在接收完一数据后,可以比对尾来确定数据是否接收完整。如果尾正确,则处理接收到的完整数据;如果尾不正确,则丢弃该数据,并重新开始接收下一数据。 需要注意的是,在设计头和尾时,要保证其与实际数据不会出现冲突,以免造成误判或混淆。 总结起来,使用HAL库进行串口接收处理尾需要设置合适的头和尾,并使用状态机来处理接收过程,结合校验来保证接收到的数据完整性。这样可以更加可靠和灵活地进行串口通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值