• 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等异常中断的处理!

  • 相关阅读:
    HDU1251 字典树 这题亮点在于是我自己写的字典树
    POJ3253 哈夫曼树+小根堆 【自己实现】
    poj3083 深搜
    用c语言的感觉
    poj1321 深搜
    POJ 2488 深搜
    HDU2037 今年暑假不AC 贪心
    hdu1247 Hat’s Words 字符串模拟
    Thrift框架具体使用
    如何使用Rose将类图转化为java代码
  • 原文地址:https://www.cnblogs.com/wfy680/p/14646778.html
Copyright © 2020-2023  润新知