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数据的干扰?
第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的结构,中断的处理不会影响到串行数据的接收。
2、液晶和AD应该用的不是串口中断吧,如果不是,只要保证接收所用的数组不一样一般就不会有问题了
唉,这个看不懂哇
中空板|防静电中空板www.cheng-sen.com
我在接收中断单步调试的时候,发现数据接收一半的时候就跳到AD中断里去了,虽然我接收的数组名称肯定不一样,但是我的数据来自RXBUF0,会不会有可能液晶或AD的底层驱动里涉及到了RXBUF0的读写啊?
这个肯定是不会直接影响RXbuf的,rxbuf只在串口使用时会被改变,如果串口接收出错,可能是多个中断情况下软件冲突没处理好,有多个中断源的情况下,特别要注意中断服务程序的精简,不要在中断服务程序里执行大量工作
这个是绝对不可能的!
首先,串行通讯是一个字节一个字节的通讯,只有接收到一个完整的字节之后才会进入中断服务程序,MSP430不支持中断嵌套,所以在中断服务里不会进入AD中断。
其次,在字节与字节之间,可能进入AD中断,因为在这个时候尚未收到完整的字节,串行通讯可能仍在运行中。同样的,中断服务运行起来之后串行中断就无法运行了。如果AD中断时间过长,可能影响到串行数据的接收。
我的书上说采用矢量中断,支持多个多个中断源,可以任意嵌套。。。。。。。。。。。。
我或许说得不是那么妥当,见下面的链接
http://www.21ic.com/jichuzhishi/datasheet/MSP430/data/190891.html
你应该没有这么用吧。。。在中断服务里再打开总中断开关,目的仅仅是实现可能来的中断嵌套。。。
其实完全可以等待中断服务结束后再响应在这其中到来的中断
MSP430默认关闭中断嵌套,打开嵌套的方法是在中断服务函数中打开总中断。
是的,这是打开总中断。进入中断程序后总中断是关闭的,你如果想在中断中接收另一个中断就需要再次打开总中断。