打印
[信息]

【实战经验】USART 中断方式接收无响应问题的一种情况

[复制链接]
658|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-17 09:56 编辑

                                          USART 中断方式接收无响应问题的一种情况及其处理方法
    问题:
此问题由客户工程师提出,客户在使用STM32F103 的USART 做串口通讯时,发现了一个问题,当设备正常通信一段时间后,串口不响应外部的通信请求了.
文中配图引用自STM32F103 的中文版本用户手册 ,下载链接为 :


                                                                                             



调研:
    一、 经过调研:
                1.1 客户除了使用USART 做串口通信,还开启了定时器中断来进行数据采集.
                1.2 定时器的优先级比串口接收的优先级高.
                1.3 定时器处理数据操作也比较频繁.
                1.4 客户使用的STM32F1 标准库(版本V3.5.0).

    二 、经过问题复现和使用ST-LINK 在线调试和定位发现:
                2.1 在出现这个问题的时候,程序不断的进入串口接收中断,不能够运行到main 主函数处理其他任务了.
                2.2 发现ORE 标志为‘1’,也就说明程序是发生了串口溢出错误.
                2.3 客户在进入串口中断后会调用USART_GetITStatus(USART2, USART_IT_RXNE) 来获取RXNE 的值.如果RXNE 为1 则去读取DR 数据寄存器的数据,读取后RXNE 为0,但 ORE 的标志依然为1,依然进入了串口中断.
    三、 经过分析以及我们可以通过我们芯片的用户手册可以得到以下信息:
                3.1 程序不断进入串口中断是因为ORE 标志始终为1,没有被用户清除掉:

                                                                                    

从上图红色部分我们可以看到,如果串口接收中断开启了,那么ORE 为1 时就会产生中断.
                 3.2.从下图我们可以看到,顺序执行对USART_SR 和USART_DR 的操作就会清除ORE 的标志,客户在中断中执行了以下操作,那为什么ORE 标志还没有被清除呢?(R1 执行了读
USART_SR 操作,R2 执行了读USART_DR 操作).

                                                                                                

          3.3 我们可以看手册中下表的解释:
                      3.3.1 ORE 表征的是一个历史事件,当ORE 为1 时,表明至少有1 个数据已经丢失.
                    3.3.2 这有2 种可能发生的情况,RXNE 为1 的情况R3 和RXNE 为0 的情况R4,如下图中的解释.

                                                                                   

             3.3.3 我们从上图可以看出,3.2 图中的R1+R2 操作只能处理RXNE 为1 的情况;
    当 RXNE 为0 的特殊情况, 就是在读序列器件(在USART_SR 寄存器读访问和USART_DR 读访问之间)接收到新的数据,数据SR 虽然被读过了,但是overrun 事件依然发生了,以上操作是不能够处理的:

                                                                                   

        
           3.4 因此我们要在应用中对ORE 标志进行处理,即当判断发生ORE 中断的时候,我们再读一次 USART_DR 的值,这样如果没有新的Overrun 溢出事件发生的时候,ORE 会被清除,然后程序就不会因为ORE 未被清除一直不断的进入串口中断了,代码处理如下:

                                                                                         

结论:
    对于这种情况,我们可以看到USART 串口接收中断使能了,那ORE 中断也就开启了;为了消除在通过读序列(USART_SR/USART_DR)的过程中产生的溢出错误,我们可以尝试在应用程序中需要针对ORE 标志做一个处理来清除ORE 标志,使得串口通信可以正常的继续工作.
    建议客户在做串口通信时需要增加帧检验功能,如CRC 校验等...,当发生ORE 时,帧校验肯定是通不过的,不会造成从机误响应.


对应PDF:USART 中断方式接收无响应问题的一种情况及其处理方法

更多实战经验请看:【ST MCU实战经验汇总贴】


沙发
icecut| | 2016-5-13 17:31 | 只看该作者
开着串口去调试的时候,仿真器断掉代码,串口也有可能出现丢数和错误寄存器置位.
大部分人运行的轻载状态.所以遇不到这种问题.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17097

帖子

287

粉丝