STM32的UART检测到上溢错误、一直进中断

问题

做项目的时候,发现程序莫名的就会死掉,因为采用了串口通信,需要不断的去接收数据,而且频率相对较快。
用JLink进行硬件调试,发现死在了串口中断里面,不停的进入中断,查看寄存器状态,发现ORE控制位被使能,查阅资料后发现是检测到上溢错误,才导致的这种问题。

在这里插入图片描述
出现ore中断,不能通过watch窗口,必须等出现后再去读取SR寄存器,否则你一直在窗口读取的话,中断永远不会复现,因为清零了,看手册嘛

在这里插入图片描述

也不能用这个窗口观察,否则依旧嘎嘎,这个问题真的挠头

在这里插入图片描述

原因

在接收数据时,如果RXNE还没有被复位,而这时又接收到一个字符就会发生溢出错误。比如我在上边打断点,串口助手连续发送数据,就噶了

解决

if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
    res_err=USART_ReceiveData(USART1);
    //USART_ClearFlag(USART1, USART_FLAG_ORE); //清除溢出中断,其实没用,因为手册里讲了
	//通过读入USART_SR 寄存器,然后读入 USART_DR寄存器来清除标志位
}

//USART_ClearFlag(USART1, USART_FLAG_ORE); //清除溢出中断,其实没用,因为手册里讲了
//通过读入USART_SR 寄存器,然后读入 USART_DR寄存器来清除标志位

所以下边这样做是没用的

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
    USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

在这里插入图片描述

函数也说明了哈,请你不要无中生有,想当然

在这里插入图片描述

补充

有的说下边这句话能打开ORE中断,ore是在打开RXNE自动开启的,所以这句话没吊用

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	//USART_ITConfig(USART1,USART_IT_ORE,ENABLE);//有的说这样能打开ORE中断,ore是在打开RXNE自动开启的,所以这句话没吊用

你看吧,人家压根就没有这个参数

在这里插入图片描述

参数检查也不会通过

assert_param(IS_USART_CONFIG_IT(USART_IT));
#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \
                                ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \
                                ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \
                                ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR))

参考文章:
文章

总结

不要想当然
多看看手册,英文的为最官方的,中文也有翻译错的
在这里插入图片描述

转载不声明,谭泥小机急

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F103是意法半导体公司推出的32位Cortex-M3内核的微控制器系列,其中包含UART2通信功能。 UART(通用异步收发器)是一种常用的串行通信接口,用于将数据从一个设备传输到另一个设备。STM32F103系列的微控制器具有多个UART接口,其中之一是UART2。 UART2接口在STM32F103系列的不同芯片上可能会有一些差异,但基本原理相同。UART2通信主要涉及到以下几个要点: 1. 配置:首先,需要配置UART2的工作参数,如波特率、数据位数、校验位、停止位等。可以使用寄存器来行配置。 2. 传输数据:可以使用UART2接口行数据传输的两种方式——中断驱动和轮询模式。 - 中断驱动模式:启用UART2接收和发送中断,通过中断服务程序(ISR)来处理接收和发送数据。 - 轮询模式:通过检查状态寄存器,判断接收/发送缓冲区是否为空,然后相应地读取/写入数据。 3. 数据传输完成检测:在数据传输完成后,需要检测是否成功传输。可以通过读取状态寄存器中的标志位来判断传输是否完成。 4. 错误处理:在UART2通信中,可能会遇到一些错误,如串口错误、奇偶校验错误等。需要根据具体情况行适当的处理。 需要注意的是,UART2通信涉及到多个寄存器和配置参数,因此在使用之前需要仔细阅读STM32F103的参考手册和相关资料,以确保正确配置和操作UART2接口。 综上所述,STM32F103的UART2通信具有一定的配置和操作步骤,可以通过配置寄存器和相应的中断服务程序或轮询模式来实现数据的收发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不熬夜,早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值