项目需要在做485串口收发测试的时候,用的STM32F072,配置完GPIO,USART3,NVIC使能RXNE和TXE中断后,先在主循环里写串口循环发送的函数USART_SendData(USART3,abuff[i++]);
1.发现无法在串口助手看到数据,一开始以为配置函数写错了,重新检查一遍配置,没发现问题,之前记得51单片机在初始化里使能串口中断会有BUG(不确定不一定对),不知道F0芯片有没有这个毛病,把中断使能放在外面后,也没有解决,排除。
2.然后用仿真器DEBUG,发现根本跑不进主循环,直接跑进USART3_4中断程序,一直出不来,应该是触发了TC,TXE,RXNE的中断,一直跑进中断函数,用仿真器DEBUG一下,看一下三个标志位,发现是TXE一直被触发,但是我写了USART_ClearITPendingBit(USART3,USART_IT_TXE);
在没有发任何数据的时候,依然跑死在TXE中断里,然后查询库函数USART_ClearITPendingBit
(1)RXNE的标志位通过读DR寄存器或通过USART_RequestCmd()将RXFRQ位写1来清除.
(2)TXE的标志位通过写DR寄存器或通过USART_RequestCmd()将TXFRQ位写1来清除.
(3)TC标志位只能通过先读SR寄存器,再写DR寄存器实现清除
简单来说,为了我不再犯错方便记忆,可以这么说,既然开了接收中断要用接收数据,既然开了发送中断,那就要发送数据,发送完了要检查是不是发送完了(USART_GetITStatus)再发数据告诉二傻子发送完了,如果不用,那就别开中断。
if(USART_GetITStatus(USART3, USART_IT_TXE) == SET)//TDR寄存器空中断 { USART_ITConfig(USART3, USART_IT_TXE, DISABLE); //不用就把这关了,或者干脆别开中断 // USART_SendData(0xAA);//F0芯片清除TXE标志位方法一——写DR寄存器 // USART_RequestCmd(USART3,USART_Request_TXFRQ,ENABLE);//F0芯片清除TXE标志位方法二——写1到TXFRQ // USART_ClearITPendingBit(USART3,USART_IT_TXE);//注意:F0芯片对TXE这样操作没用!!! }
最后别忘了在USART中断函数里加上溢出中断判断,因为你开了RXNE中断就默认开启ORE(OverRunErorr),接收数据一旦超时,就给你跳进这个中断,数据仍然在DR寄存器,仍能被读出(有多种情况,具体情况见手册的中断章节),记得加上下面的处理,
//溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题 if(USART_GetITStatus(USART3, USART_FLAG_ORE) == SET)//ORE溢出中断,先读SR { USART_ClearFlag(USART3,USART_FLAG_ORE);//清除标志位 USART_ReceiveData(USART3);//读DR寄存器 }