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.

[参考译文] TMS320F28335:中断禁用/重新启用

Guru**** 2581345 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/651477/tms320f28335-interrupt-disable-re-enable

器件型号:TMS320F28335

大家好、我正在运行两个中断: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 John:

    感谢您的提问。 此主题已分配给 C2000专家、应尽快回复。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 John:

    您说"丢失 INT13_ISR"是什么意思? 您的意思是您根本没有从它获得任何更多的中断、还是意味着它在被 INT3中断后无法返回 INT13_ISR 并完成它?

    是否在中断上下文中调用 EEPROMB_Loop ()? 请阅读《系统控制和中断用户指南》中有关在 PIEIER 中禁用中断时避免竞争条件的说明。 另外、请注意 PIEACK = 0不会产生任何影响- PIEACK 位写入1以清除位。

    关于 IER &= M_INT3的问题--它只是禁用所有较低优先级的中断。 在这种情况下、除了 INT3、它恰好禁用了所有功能、但您可以调整掩码、以便根据需要使其他屏蔽功能保持启用状态。

    惠特尼