zoukankan      html  css  js  c++  java
  • STM32串口接收中断溢出问题解决

    串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)

     

     ORE标志位在USART_SR寄存器,但值得注意的是,当我们打开串口接收中断时,同时也就打开了ORE中断。

    清除ORE位的方法:顺序执行对USART_SR和USART_DR寄存器的读操作。
    注意:在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。
    还有ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)
    这些都是在这个帖子里读到的http://blog.csdn.net/love_maomao/article/details/8234039帖子还指出了手册的翻译错误,哈哈,很厉害的博主(在此表白)。
    最后附上解决方案:
    中断服务函数:

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

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    //rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据
    }

    ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)

    USART_GetITStatus(USART1,USART_IT_ORE)这个函数在USART_IT_ERR未使能时并不能正确读取ORE的状态!

    可以使用USART_GetFlagStatus(USART1,USART_FLAG_ORE)读取,或者初始化时使能USART_IT_ERR。

    补充一下这俩函数的区别(看库函数更直接):

    IT主要就是与中断相关的,检查USART中断产生与否,当USART发送完成后会有USART_IT_TC中断,因此可以用来判断,而USART_GetFlagStatus是USART标志位设置与否,其中就有发送完成标志位USART_Flag_TC所以也可用来判断。而最终都是操作ISR寄存器

     

     

     

    • USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
    • ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)

    解决办法:

           1.  初始化时,开启中断

    USART_ITConfig(USART1, USART_IT_PE, ENABLE);    //开启PE错误接收中断Bit 8PEIE: PE interrupt enable
      //CR2 开启ERR中断
      USART_ITConfig(USART1, USART_IT_ERR, ENABLE);

           2. 在STM32中断函数增加USART_IT_ORE等异常中断的处理!

  • 相关阅读:
    快速排序
    冒泡排序
    mysql 拷贝表插入新的表
    http协议
    nginx错误日志error_log日志级别
    MySQL数据库远程访问的权限
    mysql create database 指定utf-8编码
    MYSQL日志
    linux常用命令
    java学习--基础知识进阶第六天--集合&迭代器、增强for & 泛型、常见数据结构、List子体系
  • 原文地址:https://www.cnblogs.com/wfy680/p/14646778.html
Copyright © 2011-2022 走看看