| 
 
| 本人最近需要用2812的中断嵌套解决一个问题,经过验证不同组的中断可以通过EINT来实现中断嵌套。 
 而同组中断由于使用相同的应答位,所以当同组有一个中断在响应时(已经使能全局中断EINT),同组另一个中断被触发,ACK不能响应,所以无法实现中断嵌套,例如EVA外设在响应TIUFINT中断时(已有EINT),如果触发了TIPINT中断,不会发生中断嵌套,所以为了实现同组中断嵌套,在进入同组中某个intISR时,必须清除应答位和使能全局中断EINT。
 
 我使用了EVA外设的T1UFINT和TIPINT中断,中断配置如下:
 
 EvaRegs.GPTCONA.all = 0;
 
 //打开T1UFINT的外设IFR和IER,以及PIE中的IFRIER
 EvaRegs.EVAIMRA.bit.T1UFINT = 1;
 EvaRegs.EVAIFRA.bit.T1UFINT = 1;
 
 PieCtrlRegs.PIEIER2.bit.INTx6 = 1; /* T1UFINT */
 PieCtrlRegs.PIEIFR2.bit.INTx6 = 0; /* T1UFINT */
 
 /////////打开T1PINT的外设IFR和IER,以及PIE中的IFRIER///////
 EvaRegs.EVAIMRA.bit.T1PINT = 1;
 EvaRegs.EVAIFRA.bit.T1PINT = 1;
 
 PieCtrlRegs.PIEIER2.bit.INTx4 = 1; /* T1PINT */
 PieCtrlRegs.PIEIFR2.bit.INTx4 = 0; /* T1PINT */
 
 IER |= M_INT2;
 
 EvaRegs.T1PR = 7499;
 EvaRegs.T1CON.all = 0x8842
 
 中断子程序如下:
 
 interrupt void T1UFintISR(void)
 
 {
 
 ////低优先级的TIUFINT一旦响应,就复位PIEACK和外设中断标志位,以便同组的TIPINT中断可以顺利通过三级中断通道到达CPU来响应
 
 EvaRegs.EVAIFRA.all = BIT9;
 
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
 EINT;
 
 T1UFINT();
 
 }
 
 interrupt void T1PintISR(void)
 
 {
 
 T1PINT();
 
 //中断TIPINT()执行完后,清除外设中断标志和PIEACK。
 
 EvaRegs.EVAIFRA.all = BIT7;
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
 
 }
 
 通过配置两个中断都实现了,但是中断嵌套确没有实现。按理说,上面的偏置应该可以使TIPINT中断可以打断TIUFINT中断,而反之不能。
 
 不知道哪里出问题了!希望高手可以解答一下!谢谢
 | 
 |