大家好、我正在运行两个中断:1)用于 SPI 和 CAN 的 INT13和2)用于控制(时间关键型)的 INT3.3。 INT13是嵌套到 INT3.1的 wrt、也就是说 INT3.1可以中断 INT13_ISR (我在 http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x 上的理解)
main (空)
{
InitSysCtrl();
DisableDog ();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM1_INT =&epwm1_timer_ISR;
PieVectTable.XINT13 =&CpuTimer1_INT13_ISR;// CPU1 32位计时器 INT13
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
EALLOW;
XIntruptRegs.XNMICTR = 0;//计数器(CPU_Timer1 = INT13)
EDIS;
Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
InitFlash();
EPwm1TimerIntCount = 0;
IER |= M_INT3 | M_INT13;// CPU 中断13 (CPUTimer1)和3 (ePWM1):需要设置 IFR 和 IER
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;// ePWM1_INT_ENABLE (ePWM1);
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
中断空 CpuTimer1_INT13_ISR (空)// CPU1 32位计时器 INT13
{
//=========== 嵌套-允许 ePWM1 INT============
Int16 TempPIEIER;
if (State!= 6){
TempPIEIER = PieCtrlRegs。 PIEIER3.ALL;
IER |= M_INT3;//启用连接到 EPWM1-3 INT 的 CPU INT3:
IER &= M_INT3; //??????????????
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//在 PIE 中启用 ePWM INT3:PWM1_INT_ENABLE INT3.1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;//确认此中断以接收来自组3的更多中断
asm (" NOP");
EINT;//asm (" CLRC INTM");
//通信代码//
Dint;
PieCtrlRegs.PIEIER3.ALL = TempPIEIER;
EDIS;
}
3) 3)禁用/重新启用 INT3.3代码
空 EEPROMB_Loop ()
{
//禁用 INT3.1
EALLOW;
IER = 0x1000;
PieCtrlRegs.PIEIER3.bit.INTx1 = 0;
PieCtrlRegs.PIEACX.ALL = 0;
EDIS;
Update_EEPROMB();// EEPROMB 编程
if (启用= 0x0C)//重置/关闭
{
//启用 INT3.1
STATE = 2;//初始化并重新加载 EEPROMB 参数
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//IER = 0x1004;
IER |= M_INT3;//0x1004;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEACX.ALL = 0;
EDIS;
}
此代码将暂停 INT3.3并继续运行 INT13、但当我重新启用 INT3.3 (IER = 0x0000/4)时、我会丢失 INT13_ISR。 我不知道为什么嵌套代码会造成问题? 此外,我不确定为什么在嵌套算法(http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x )中使用 IER &= M_INT3。
感谢你的任何帮助
John