This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于F28335 PIE中断标志位何时清零的问题

问题描述:F28335的PIE中断标志位是什么时候清零的呢?资料中介绍在发生中断后,PIE级的终端标志位是自动清零的,但是我查询了很多资料,并没有找到具体何时清零的。一般外设的中断标志位会在中断程序中清零,如果PIE 级的中断标志位在此之前清零,那么不就会再次把PIE级的中断标志位置1吗(因为外设满足终端标志位和中断使能位为1)?想了很长世间了,搞不懂~

  • 在CPU跳转到ISR入口前CPU会自动清除 PIEIFRx.y 。PIEACK的相应位需要手动清除,一般会在ISR推出前清除PIEACK的相应位。

  • 谢谢您的回答,那么请问外设在条件1、某个外设中断标志位置位2、相应的外设中断使能位置位 成立的情况下就会产生中断申请信号吗?也就是立即再把相应的PIE中断标志位PIEFIR置位吗?如果是这样的话,在进入中断之前就清零了PIEIFR,那么因为还没进入中断函数清零,外设部分仍然满足中断申请条件,岂不是又立即只为了PIE的中断标志位PIEIFR?这样中断不久会一直进行下去吗???

  • 是的,在满足条件1和2的情况下,PIEIFRx.y会置位,但如果PIEACKx=1的话,CPU 并不会去响应中断,因此不会有你说的问题。而CPU在中断再响应中断前已经自动将PIEACKx=1了。因此在你手动清除PIEACKx前,同一行的中断时响应不了的。

    具体可以查看手册SPRUGL8的下面部分:

    Figure 77. Typical PIE/CPU Interrupt Response - INTx.y

  • 就算是PIEACKx=1的时候不会响应中断,但是手动清除PIEACKx之后,由于PIE中断标志位是1,还是会再次响应该中断的啊,只不过把这个中断延时了,最终还是会再次进入这个中断啊。

    我再结合您的回答重新整理一下我的问题:假如发生了一个外设中断,对于这个中断来说,在它的外设级,那么1、它的外设中断标志位会置位,如果2、中断使能了,那么外设级就会向PIE级产生中断申请;在PIE级中,收到中断申请会把1、相应的中断标志位置位,如果相应2、PIE级中断使能了,并且3、PIEACKx为0,那么就会向CPU级发送中断申请,并且这时把PIEACKx置位,阻止同组中断的继续发生;然后中断申请信号进入CPU级。在响应中断函数前硬件清零了PIE级别的中断标志位,在响应中断时软件清零了外设的中断标志位,并且清零了相应的PIEACKx;但是这时请注意、注意、注意:中断响应函数清零外设中断标志前,在外设级别会一直满足条件1、中断标志位为1,2、中断使能,那么就会使PIE级别的中断标志一直为1,不管之前是否清零过,那么在清除了PIEACKx后,将再次发生中断,所以这个中断是会发生两次的,除非PIE级别的中断标志位是在中断响应函数清零之后再清零;不知道我的理解哪里出现问题了,想不通。。。。。。

  • 不知道你是否有看我跟你说的那一个流程图,就算手动清除PIEACKx,但是因为IERx在中断响应时已经清0了,而且默认的全局中断使能也禁止了,因此只有中断返回后才能重新响应相应行的中断。

  • 那个图我看了,如下:我的意思是在中断阶段 Stage I 之后,也就是PIEFIRx.y清除之后,由于在外设的中断标志位和中断使能位都仍然是1,那么必然将导致PIEFIRx.y重新置1,虽然在 Stage J 可能清除了外设的中断标志位,但是PIEFIRx.y的值已经在之前就置1了,那么在Stage J 把PIEACKx清除之后,不就又会导致中断的发生吗?