STM32F103处理器USART2接收中断读RXNE总是为0的原因请教?

2019-12-23 18:37发布

STM32F103处理器USART2接收中断读RXNE总是为0,原因不明,请教各位大侠:

开发环境: IAR5.4 +IAR J-Link, DX STM32开发板子;使用STM32官方的3.0版本库
移植OS:  RT-Thread OS 0.3

故障现象: 1.USART2设置接收中断模式,能够相应中断,能够进入中断程序;发送是设置为轮询模式。
           2. 进入中断程序以后,执行以下语句,不能正确读取RXNE状态,返回结果是“RESET”。
                if(USART_GetITStatus(USART2 USART_IT_RXNE) != RESET)//读取USART2的中断标志位。正确情况应该返回1.
           3. 将以上判断语句去除,直接读取USART2的接收寄存器,可以得到正确的数据。(上位机发什么数据,USART2就接收到什么数据)
           4. 通过IAR环境,J_link单步调试,查看USART2的状态寄存器SR,在IAR环境下看到的RXNE位始终为0。(不管USART2是否产生接收中断)
           

同样的USART1设置,但是USART1能够正确读取到RXNE的置1。(在IAR环境下,查看RXNE依然是0,但是程序读取出来是RXNE位是1)


我的USART2设置代码如下:
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
        /* Enable USART2  Rx Interrupt request */
        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
        USART_Init(USART2, &USART_InitStructure);
        USART_ClockInit(USART2, &USART_ClockInitStructure);
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        USART_Cmd(USART2, ENABLE);


请各位大侠分析分析原因看。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
__STM32__
1楼-- · 2019-12-23 21:29
在判断RXNE是否为0之前,你做了什么?是否已经无意中清除了这个标志?
swordlife
2楼-- · 2019-12-23 23:20
 精彩回答 2  元偷偷看……
__STM32__
3楼-- · 2019-12-24 02:23
那么你是如何知道RXNE总是为0?是通过设置调试断点观察的还是直接执行程序呢?

如果是通过设置断点再单步执行,则在程序停到断点时,调试器的显示功能在读取状态寄存器的同时已经清除了标志,你再单步执行时RXNE已经变为了'0'。这种情况下,应该把调试断点放在判断语句之后而不是之前。
swordlife
4楼-- · 2019-12-24 02:26
我设置的断点在刚刚进入中断程序的时候,还没有对RXNE判断。图片如下:

(原文件名:1.JPG)
swordlife
5楼-- · 2019-12-24 08:14
图片上传以后模糊了,补充说明:
1. 右边的窗口查看USART2_DR寄存器接收到了正确的字符“4”.但是“RXNE”依然为0.
2. 图片中红 {MOD}的语句就为判断“RXNE”的语句,在目前这个断点的时候,此语句还没有执行。
__STM32__
6楼-- · 2019-12-24 13:18
清除RXNE的条件就是读出DR寄存器,程序停在断点时,调试器需要读出各个寄存器的内容(包括DR寄存器),并显示在寄存器窗口;也就是说,RXNE已经被调试器清除了,所以我建议你“应该把调试断点放在判断语句之后而不是之前”。

一周热门 更多>