6366|11

333

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

接收中断写与不写“while (!(IFG1 & URXIFG0));”有什么区别? [复制链接]

1.这两段程序有什么区别?
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{     
  while (!(IFG1 & URXIFG0));
  IFG1 &=~URXIFG0;   
RxBuf[RxPoint++]=RXBUF0;  
}
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{     
RxBuf[RxPoint++]=RXBUF0;  
}

2.我在接收数据的时候,可能液晶或者AD在同时工作,如果他们也用到了接收中断,那么会不会我接收到的数据是经过了液晶和AD数据的干扰?

最新回复

是的,这是打开总中断。进入中断程序后总中断是关闭的,你如果想在中断中接收另一个中断就需要再次打开总中断。  详情 回复 发表于 2014-9-9 09:04
 
点赞 关注(1)

回复
举报

1193

帖子

0

TA的资源

纯净的硅(高级)

推荐
 
第1个问题:
IFG1,中断标志寄存器 1
UTXIFG0 位 7 USART0 发送中断标志。 当 U0TXBUF 为空时,UTXIFG0 被置位。
URXIFG0 位 6 USART0 接收中断标志。 当 U0RXBUF 收到一个完整的字符时,URXIFG0 被置位。

while (!(IFG1 & URXIFG0));
上面这句的意思是进入了UART0RX_VECTOR之后,先判断一下是不是串口接收中断,如果是,再处理下面的语句。如果不是,那就等待直到串口接收中断标志被置位,再执行下面的语句。

不知道你用哪款单片机,上面这句一般是在有多源中断的情况下使用的,也就是UART0RX_VECTOR可能有多个中断源,因此在中断服务里要先判断中断是否来自于期望的中断源。

第2个问题,
一般情况下片上AD有自己的中断向量,因此不会有干扰。但是如果你使用了片外AD并且使用硬件串行通讯器控制AD,那么有可能造成干扰。液晶也是一样,只要你的控制模块不是同一个串行通讯模块,就不会干扰。
另外,你说的“干扰”更像是中断冲突,中断会存在冲突,但是只是孰先孰后的问题,多个中断都会响应的。硬件串行通讯器是独立于CPU的结构,中断的处理不会影响到串行数据的接收。
 
 

回复

1792

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
2、液晶和AD应该用的不是串口中断吧,如果不是,只要保证接收所用的数组不一样一般就不会有问题了

点评

我在接收中断单步调试的时候,发现数据接收一半的时候就跳到AD中断里去了,虽然我接收的数组名称肯定不一样,但是我的数据来自RXBUF0,会不会有可能液晶或AD的底层驱动里涉及到了RXBUF0的读写啊?  详情 回复 发表于 2014-8-29 11:00
 
 
 

回复

260

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
唉,这个看不懂哇
 
个人签名中空板|防静电中空板www.cheng-sen.com
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

4
 
sint27 发表于 2014-8-29 10:11
2、液晶和AD应该用的不是串口中断吧,如果不是,只要保证接收所用的数组不一样一般就不会有问题了

我在接收中断单步调试的时候,发现数据接收一半的时候就跳到AD中断里去了,虽然我接收的数组名称肯定不一样,但是我的数据来自RXBUF0,会不会有可能液晶或AD的底层驱动里涉及到了RXBUF0的读写啊?

点评

这个是绝对不可能的! 首先,串行通讯是一个字节一个字节的通讯,只有接收到一个完整的字节之后才会进入中断服务程序,MSP430不支持中断嵌套,所以在中断服务里不会进入AD中断。 其次,在字节与字节之间,可能进入  详情 回复 发表于 2014-8-29 11:19
这个肯定是不会直接影响RXbuf的,rxbuf只在串口使用时会被改变,如果串口接收出错,可能是多个中断情况下软件冲突没处理好,有多个中断源的情况下,特别要注意中断服务程序的精简,不要在中断服务程序里执行大量工作  详情 回复 发表于 2014-8-29 11:09
 
 
 

回复

1792

帖子

0

TA的资源

五彩晶圆(初级)

6
 
面纱如雾 发表于 2014-8-29 11:00
我在接收中断单步调试的时候,发现数据接收一半的时候就跳到AD中断里去了,虽然我接收的数组名称肯定不一 ...

这个肯定是不会直接影响RXbuf的,rxbuf只在串口使用时会被改变,如果串口接收出错,可能是多个中断情况下软件冲突没处理好,有多个中断源的情况下,特别要注意中断服务程序的精简,不要在中断服务程序里执行大量工作

 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

7
 
面纱如雾 发表于 2014-8-29 11:00
我在接收中断单步调试的时候,发现数据接收一半的时候就跳到AD中断里去了,虽然我接收的数组名称肯定不一 ...

这个是绝对不可能的!
首先,串行通讯是一个字节一个字节的通讯,只有接收到一个完整的字节之后才会进入中断服务程序,MSP430不支持中断嵌套,所以在中断服务里不会进入AD中断。
其次,在字节与字节之间,可能进入AD中断,因为在这个时候尚未收到完整的字节,串行通讯可能仍在运行中。同样的,中断服务运行起来之后串行中断就无法运行了。如果AD中断时间过长,可能影响到串行数据的接收。

点评

我的书上说采用矢量中断,支持多个多个中断源,可以任意嵌套。。。。。。。。。。。。  详情 回复 发表于 2014-9-6 22:08
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

8
 
qiushenghua 发表于 2014-8-29 11:19
这个是绝对不可能的!
首先,串行通讯是一个字节一个字节的通讯,只有接收到一个完整的字节之后才会进入 ...

我的书上说采用矢量中断,支持多个多个中断源,可以任意嵌套。。。。。。。。。。。。

点评

MSP430默认关闭中断嵌套,打开嵌套的方法是在中断服务函数中打开总中断。  详情 回复 发表于 2014-9-7 12:30
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

9
 
面纱如雾 发表于 2014-9-6 22:08
我的书上说采用矢量中断,支持多个多个中断源,可以任意嵌套。。。。。。。。。。。。

我或许说得不是那么妥当,见下面的链接
http://www.21ic.com/jichuzhishi/datasheet/MSP430/data/190891.html

你应该没有这么用吧。。。在中断服务里再打开总中断开关,目的仅仅是实现可能来的中断嵌套。。。
其实完全可以等待中断服务结束后再响应在这其中到来的中断
 
 
 

回复

106

帖子

0

TA的资源

一粒金砂(中级)

10
 
面纱如雾 发表于 2014-9-6 22:08
我的书上说采用矢量中断,支持多个多个中断源,可以任意嵌套。。。。。。。。。。。。

MSP430默认关闭中断嵌套,打开嵌套的方法是在中断服务函数中打开总中断。

点评

是这个吗?: _EINT();  详情 回复 发表于 2014-9-7 14:38
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

11
 
王项电子 发表于 2014-9-7 12:30
MSP430默认关闭中断嵌套,打开嵌套的方法是在中断服务函数中打开总中断。

是这个吗?: _EINT();

点评

是的,这是打开总中断。进入中断程序后总中断是关闭的,你如果想在中断中接收另一个中断就需要再次打开总中断。  详情 回复 发表于 2014-9-9 09:04
 
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

12
 
面纱如雾 发表于 2014-9-7 14:38
是这个吗?: _EINT();

是的,这是打开总中断。进入中断程序后总中断是关闭的,你如果想在中断中接收另一个中断就需要再次打开总中断。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表