本人最近需要用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中断,而反之不能。
不知道哪里出问题了!希望高手可以解答一下!谢谢 |