嗨,香榭丽舍,
对于 C28x 中断嵌套,我们建议不要在 ISR 外部修改该组的 PIEIER 寄存器,否则可以触发假 INTX.1中断。
例如,我们有 INT3.8,INT9.2和 INT9.5中断,并希望优先处理 INT9.5,如果发生 INT9.2中断并在 IFR.9中锁定,然后在 CPU 分支到 INT3.8 ISR 之前,在 INT3.8 ISR 中修改 PIEIER9,然后触发虚假9.1, 这就是我们建议不在 ISR 之外为该组修改 PIEIER 的原因。
__中断无效 EPWM8_ISR (无效) // INT3.8 ISR
{
UINT16_t 模板接口;
TempPIEIER = PieCtrlRegs.PIEIER9.ALL; //保存 PIEIER 寄存器以供以后使用
IER |= 0x100; //通过调整 IER 设置全局优先级
IER &= 0x100;
PieCtrlRegs.PIEIER9.All &= 0x0010; //通过调整 PIEIER9以允许设置组优先级
// INT 9.5中断当前 ISR
PieCtrlRegs.PIEACK.ALL |= 0x0100; //启用饼图中断
ASM(" NOP"); //等待一个循环
EINT; //清除 INTM 以启用中断
//在此处插入 ISR 代码....
丁;
PieCtrlRegs.PIEIER9.ALL = TempPIEIER;
}
如果我们将上述 ISR 修改为低于函数,修改 INT9.5的 PIEIER9,然后在设置 IER 寄存器之前清除 IFR 寄存器中的其他位,那么我们是否可以修改 INT3.8 ISR 中的 PIEIER9并避免 虚假的 INT9.1中断?
如果在 C28x 分支到 INT3.8 ISR 之前发生了9.2,因为 INT9.2在 PIEIFR9.2中被锁定,那么在从 INT3.8 ISR 返回之前,INT9.2中断应该在将 TempPIEIER 写回 PIEER9到 PIEIER9时恢复。
请回答正确吗?
__中断无效 EPWM8_ISR (无效) // INT3.8 ISR
{
UINT16_t 模板接口;
TempPIEIER = PieCtrlRegs.PIEIER9.ALL; //保存 PIEIER 寄存器以供以后使用
PieCtrlRegs.PIEIER9.All &= 0x0010; //通过调整 PIEIER9以允许设置组优先级
// INT 9.5中断当前 ISR
IFR &= 0x100;
IER |= 0x100; //通过调整 IER 设置全局优先级
IER &= 0x100;
PieCtrlRegs.PIEACK.ALL |= 0x0100; //启用饼图中断
ASM(" NOP"); //等待一个循环
EINT; //清除 INTM 以启用中断
//在此处插入 ISR 代码....
丁;
PieCtrlRegs.PIEIER9.ALL = TempPIEIER;
}
此致,
-卢克