首页 > 其他分享 >STM32 串口进入中断,但是没有检查到接收数据位!!!!

STM32 串口进入中断,但是没有检查到接收数据位!!!!

时间:2024-12-04 18:43:58浏览次数:11  
标签:ORE USART 中断 寄存器 RXNE STM32 串口 接收数据 USART2

最近做项目有概率遇到串口进入中断(LED闪烁来判断),但是没有检查到接收数据位 USART_IT_RXNE ,导致一直卡在判断语句 USART_GetITStatus(USART2, USART_IT_RXNE) != RESET,导致程序卡死。通过keil 调试模式的软件复位都没有用,需要硬件复位才行。通过百度发现这个现象挺常见的。这边我也整理一下,方便后面的查看。

1.问题定位:通过硬件发现问题后,进入keil 调试模式判断下问题在何处

在接收判断前后加入printf,来定位问题在何处。通过PC串口输出来定位,发现只能输出111111,不输出222222,说明中断是有触发,但是没有检查到接收数据位

2.问题分析

遇到问题先百度:通过查看大佬的分析----产生ORE中断了,但使用USART_GetITStatus()函数却无法读到这个中断被SET起来!(https://blog.csdn.net/love_maomao/article/details/8234039)

 

 本质问题:RXNE还没来得及复位(数据可能可能被读传走也有可能没有被传走),就接收到新的字符,导致溢出错误,从而触发串口2的中断相应,这和HardFault_Handler错误挺像的,都是都是溢出导致的硬件错误,后面也会讲下这个问题。

并不是RXNE 触发的USART2_IRQHandler中断,而是ORE触发USART2_IRQHandler中断,和我一开始理解的有误,我理解成是RXNE触发。

 

RXNE:读数据寄存器非空 (Read data register not empty):当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清零。RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。   0:数据没有收到;     1:收到数据,可以读出。
ORE:过载错误 (Overrun error):当RXNE仍然是’1’的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬件将该位置位。如果USART_CR1中的RXNEIE为’1’的话,则产生中断。由软件序列将其清零(先读USART_SR,然后读USART_CR)。  0:没有过载错误;  1:检测到过载错误。 注意:该位被置位时,RDR寄存器中的值不会丢失,但是移位寄存器中的数据会被覆盖。如果设置了EIE位,在多缓冲器通信模式下,ORE标志置位会产生中断的。   (ORE会导致硬件复位,如果遇到这个问题是没有办法通过软件复位决绝的,刚开始遇到这个问题,已经是我写的程序有问题,打算添加看门狗进行软件复位,发现没有效果)

 在打开接收使能时,会一起开始ORE中断使能,没有办法通过关闭ORE使能来规避问题。因此需要检查到ORE标志位后,需要手动清除ORE标志位。

 

3.解决办法:

          使用USART_ClearITPendingBit();无法清除ORE的标志位,该函数只有CTS,LDB,TC和RXNE。

 查找库函数手册:

 

最终加一个判断:

    if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志
    {
        USART_ClearFlag(USART2,USART_FLAG_ORE);
        USART_ReceiveData(USART2);
         rxIndex = 0;
    }

 

标签:ORE,USART,中断,寄存器,RXNE,STM32,串口,接收数据,USART2
From: https://www.cnblogs.com/wuqudelinghun/p/18586494

相关文章

  • 26 基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,六个按键,分别代表指纹、蓝牙、刷卡的正确进门与错误进门;比如第一个按键按下,表示指纹正确,OLED显示指纹正确,开门,第二个按键按下的话,则指纹错误,OLED显示指纹错误,请重试,第二个按键连......
  • STM32 毕业设计注意事项全攻略
    目录一、确定项目方向与需求二、把控项目难度与进度1.难度适中2.合理规划进度三、电路设计注意事项1.稳定性与可靠性2.电源与信号线连接四、代码编写要点一、确定项目方向与需求在进行STM32毕业设计时,首先要明确项目方向与需求,这是至关重要的一步。不能仅凭......
  • 关于串口通信读取BL0942芯片电压电流的使用
    概述: 通过串口通信来获取BL0942芯片采集到的电压电流,采用的芯片为10引脚类型,电压采样为电阻采样,电流采样为互感器采样。芯片功能特点:两路独立的Sigma-DeltaADC,一路电流和一路电压。电流有效值范围(10mA~35A)@1mohm有功电能(1w~7700w)@1mohm可测量电流电压有效值,快速电......
  • STM32单片机芯片与内部01 GPIO-通用输出与输入-架构、内部、介绍、功能
    目录一、GPIO架构1、GPIO简介2、架构(1)、二极管保护与上下拉电阻(2)P-MOS与N-MOS推挽与开漏(3)、输出数据寄存器(4)、复用功能输出(5)、输入数据寄存器(6)、复用功能输入(7)、模拟输入与输出二、GPIO工作模式1、输入模式(上拉、下拉、浮空)2、输出模式(推挽/开漏,上拉/下拉)3、复用......
  • STM32之ADC采集和DMA传输(八)
    STM32F407系列文章-内部ADC采集和DMA传输(八)目录前言一、ADC特性二、DMA特性三、ADC采集1.单通道ADC采集1.头文件定义2.函数adc_init()3.函数HAL_ADC_MspInit()4.函数adc_channel_set()5.函数adc_get_result()6.函数adc_get_result_average()2.多通道ADC采集四......
  • STM32设计的物联网智能鱼缸
    ......
  • 串口助手极限测试
    昨天测试串口助手,发现高速数据流对串口数据压力很大,经测试,压力主要来自windows的组件的接收字串并渲染的速度。测试代码如下:byteresult;while(true){while(serial.IsOpen&&serial.BytesToRead>=0)......
  • 单片机学习笔记 15. 串口通信(理论)
    更多单片机学习笔记:单片机学习笔记1.点亮一个LED灯单片机学习笔记2.LED灯闪烁单片机学习笔记3.LED灯流水灯单片机学习笔记4.蜂鸣器滴~滴~滴~单片机学习笔记5.数码管静态显示单片机学习笔记6.数码管动态显示单片机学习笔记7.独立键盘单片机学习笔记8.矩阵键盘按......
  • 对串口接收时发送数据会导致被接收的数据错位乃至丢失的原理解读
    缘由:在进行STM32与ESP8266通信时,我在接收中断中使用了HAL_UART_Transmit与printf函数,发现ESP8266返回来的数据有一定的丢失与错位现象,在对逻辑进行改写后发现问题与HAL库本身函数有关,这引起了我对其的兴趣。原理:我使用了串口空闲中断接收数据,而HAL_UART_Transmit在底层调用......
  • 第三次stm32学习(LCD)
    利用原有的LCD驱动程序实现一些操作。从其他文件复制lcd.c和lcd.h和fonts.h到自己的工程下,再打开keil5点击魔法棒右边的按钮,选Application/User在AddFiles加入lcd.c。同时应用头文件(#include"lcd.h")LCD_Init()初始化LCD_Clear(Black);清屏使lcd变为某颜色LCD_SetTextColo......