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

这篇具有很好参考价值的文章主要介绍了STM32的UART检测到上溢错误、一直进中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

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

串口溢出错误,stm32,stm32,单片机,嵌入式硬件
出现ore中断,不能通过watch窗口,必须等出现后再去读取SR寄存器,否则你一直在窗口读取的话,中断永远不会复现,因为清零了,看手册嘛

串口溢出错误,stm32,stm32,单片机,嵌入式硬件

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

串口溢出错误,stm32,stm32,单片机,嵌入式硬件

原因

在接收数据时,如果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); //清除溢出中断
}

串口溢出错误,stm32,stm32,单片机,嵌入式硬件

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

串口溢出错误,stm32,stm32,单片机,嵌入式硬件

补充

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

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

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

串口溢出错误,stm32,stm32,单片机,嵌入式硬件

参数检查也不会通过

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))

参考文章:
文章

总结

不要想当然
多看看手册,英文的为最官方的,中文也有翻译错的
串口溢出错误,stm32,stm32,单片机,嵌入式硬件

转载不声明,谭泥小机急文章来源地址https://www.toymoban.com/news/detail-661316.html

到了这里,关于STM32的UART检测到上溢错误、一直进中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机】基于STM32的UART串口通信

    简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作。实验内容基于 正点原子精英板 开发板,单片机芯片为 STM32F103ZET6 。 在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作

    2024年01月17日
    浏览(70)
  • stm32基于UART串口实现modbusRTU(软件方式)

     此程序中, 串口通信方式: 115200-n-8-1, modbus协议要求帧与帧之间的间隔必须大于3.5个字符时间间隙作为帧与帧之间的分割.  字符时间计算公式: interval_time = character_interval * 8 / baud_speed * 10 ^ 6 (微秒) 1.1 设置定时器, 超时时间为interval_time. 1.2 设置stm32的uart串口接收数据中断, 每

    2024年02月15日
    浏览(34)
  • K210 UART串口通信介绍与 STM32通信

    目录 K210-UART串口通信相关函数: 使用K210串口的时候需要映射引脚: K210与STM32串口通信  发送单字节: K210端 STM32端 发送数据包 K210端 STM32端  K210的UART模块支持全双工通信,可以同时进行数据的发送和接收。在K210上使用UART串口通信,你可以连接外部设备,如传感器、显示器

    2024年03月23日
    浏览(44)
  • STM32实现UART-CAN融合式高速串口

    STM32的UART硬件电路,在进行线接传输时,一般低于230400bps的波特率,因为单端信号传输的特性,限制了传输距离和传输速度。而在同一块PCB板內进行短距离UART传输,则可以达到2Mbps及至4Mbps的传输速率,所以STM32的UART接口,能支持配置为2M或4M波特率。 如果要实现接线方式的串

    2024年02月04日
    浏览(67)
  • STM32 UART串口通信IDLE空闲中断的使用步骤

    参考了各路大神的资料,蒙蔽了半天,终于学会了,记录一下,以后忘了可以回来复习参考。 一、首先在stm32cube中配置打开对应uart串口的中断 二、工程main函数调用 __HAL_UART_ENABLE_IT(huart1,UART_IT_IDLE);//hal库宏定义,使能串口空闲中断     HAL_UART_Receive_DMA(huart1,data,sizeof(data));//使

    2024年02月12日
    浏览(40)
  • STM32CubeMx+MATLAB Simulink串口输出实验,UART/USART串口测试实验

    STM32CubeMx+MATLAB Simulink串口输出实验

    2024年02月21日
    浏览(42)
  • 基于树莓派4B与STM32的UART串口通信实验(代码开源)

    前言: 本文为手把手教学 树莓派4B与 STM32 的 UART 通讯 ,本次项目采用 树莓派4B 与  STM32  进行串口通讯,将彼此的数据进行互相传输。本篇博客同时提供了基于 YOLOv5-Lite 的目标检测数据联动,即将 树莓派4B 检测到的信息发送至 STM32 ,后续可以通过这些信息进行各种需求上

    2024年02月16日
    浏览(38)
  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(51)
  • (stm32之HAL库)UART工作在DMA模式要打开串口中断吗?

    最近学习了stm32(F4xx)的串口在DMA模式下的使用,期间以ST官方提供的例程进行参考学习,发现其初始化过程中是打开了UART的中断的,而且HAL库中stm32f4xx_hal_uart.c文件中的DMA模式使用说明里也有这么一句话: 即在非循环模式下(也就是发完一次数据就停止的常用模式)需要配置

    2024年02月12日
    浏览(37)
  • 【STM32】HAL库UART含校验位的串口通信配置BUG避坑

    【STM32】HAL库UART含校验位的串口通信配置BUG避坑 UART通过一条线就能完成数据的发送 另外一条线则完成数据的接收 所以一共是两条线 TX RX UART在空闲时为低电平 时钟周期由波特率确定 通常是115200bit/s UART协议由四个部分组成: 起始位: 固定低电平 1个时钟周期 数据域: 通常

    2024年01月20日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包