打印

请教USART中断配置

[复制链接]
5349|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JKC|  楼主 | 2008-7-1 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位给看一下:
最近用stm32f103的usart2做数据收发,配置为USART_IT_RXNE中断,在中断程序中当接收数据匹配则标识位置位,主程序查询标识位并返回调试软件相应数据,但现在有个问题让人费解:主程序中发送数据
      USART_SendData( USART2, chSend);
      while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); 
执行到发送等待时也进入中断,我在程序配置中是没有使能发送中断的怎么会发送数据也进入中断呢,而且我特意用
      USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
也是于事无补,各位给点建议看看究竟是怎么回事?急呀。
沙发
香水城| | 2008-7-1 21:28 | 只看该作者

检查一下状态寄存器

进入中断服务程序时读出状态寄存器看看是什么与原因引起的中断,这应该是每次进入中断服务程序时的第一件事,不管程序是否有问题。

使用特权

评论回复
板凳
JKC|  楼主 | 2008-7-1 22:28 | 只看该作者

回复

我看过了,程序断点进入中断后SR寄存器变成D8,虽然不太明白是怎么回事,但CR1寄存器中中断使能位是只有RXNEIE置为了1,所以还是不太明白他是怎么进入中断的。

使用特权

评论回复
地板
香水城| | 2008-7-1 22:46 | 只看该作者

估计是溢出错误造成中断

程序断点进入中断后SR寄存器变成0xD8,即有下列事件:
 TXE: Transmit Data Register Empty
 TC: Transmission Complete
 IDLE: IDLE line detected
 ORE: OverRun Error

中断很可能由ORE引起,请看有关USART_CR1寄存器RXNEIE位的说明:
RXNEIE: RXNE Interrupt Enable.
 This bit is set and cleared by software.
  0: Interrupt is inhibited
  1: An USART interrupt is generated whenever ORE=1 or RXNE=1 in the USART_SR register

产生ORE错误是因为你没有及时读出收到的数据。

使用特权

评论回复
5
JKC|  楼主 | 2008-7-2 12:10 | 只看该作者

还是有点疑惑

确实如您所说,是溢出中断搞的鬼。
我在主程序中接收一个8位数据组,程序如下,单步执行没有问题,我可以收到该数据组,也没有进入中断(可能单步就进不了中断,但寄存器正常,没有产生溢出置位)。但数据接收完成后我全速执行,再次用串口发送命令就进不了中断了。
如果不单步执行,而将下面程序全速执行的话即进入中断,寄存器显示产生溢出,这又是怎么回事?
for(i=0;i<4;i++)
   {      
      USART_SendData( USART2, chSend);
      while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); 
   }

使用特权

评论回复
6
JKC|  楼主 | 2008-7-2 12:13 | 只看该作者

还是有点疑惑

而且全速执行接收到的数据也不全,可是我的发送程序有问题吗?不就这么两句话吗?

使用特权

评论回复
7
香水城| | 2008-7-2 12:22 | 只看该作者

如果不清除错误标志位,当然会进中断

清除错误标志位的操作是:先读USART_SR寄存器,再读USART_DR寄存器。

单步执行时,寄存器显示窗口不断被调试软件刷新,即调试软件在不断地读各个寄存器,因此错误标志位被清除;而全速运行时,如果程序不主动读这些寄存器,当然错误标志位不能被清除,进中断就不奇怪了。

关键的是我在2楼给出的建议:“进入中断服务程序时读出状态寄存器看看是什么原因引起的中断,这应该是每次进入中断服务程序时的第一件事,不管程序是否有问题。”这样才能时刻知道是否出错并及时处理,同时能够及时地清除各种标志位。

使用特权

评论回复
8
JKC|  楼主 | 2008-7-2 13:46 | 只看该作者

我怀疑USART2有问题

我有点怀疑串口2有问题了尤其是其中断,因为我将程序中的全部usart2改为usart1就一点问题都没有了,各位如果有兴趣的话不妨试试。如果你们的是好的话,那我只能怀疑我这个芯片的问题了。
但我的usart2是由485芯片驱动,usart1是由232芯片驱动,我想这是没关系的吧。

使用特权

评论回复
9
香水城| | 2008-7-2 14:04 | 只看该作者

那么你就把USART2也用232芯片驱动试试看

使用特权

评论回复
10
JKC|  楼主 | 2008-7-2 14:51 | 只看该作者

sorry

sorry:
用232驱动芯片可以,用485驱动芯片就出问题了,看来不是cpu的事啊!

使用特权

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

本版积分规则

JKC

4

主题

10

帖子

0

粉丝