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.

[参考译文] TMS320F280039C:epwm1的中断仅触发一次、不会再次触发

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1434502/tms320f280039c-interrupt-for-epwm1-fires-only-once-and-never-again

器件型号:TMS320F280039C
Thread 中讨论的其他器件:C2000WARE

工具与软件:

嗨、大家好!

我负责 ePWM 外设。 我已经编写了以下代码、并且 epwm1_isr()只触发一次。 我在调试过程中看到没有清除中断标志。 但在我的 ISR 函数中、我明确清除了 epwm1中断以及 PIE 控制器的第3组中断。 请提供帮助

 


/**
* epwm1 = 2kHz 的开关频率并产生中断来切换 gpio22
* epwm2 = 4kHz 的开关频率并产生中断来切换 gpio20
*/

#include "F28x_PROJECT.h"
#include "driverlib.h"
#include "device.h"

静态易失性 uint32_t t1、t2;
静态易失性 uint16_t f2、f1;

_interrupt void epwm1_isr (void);
_interrupt void epwm2_isr (void);

void main (void)

//初始化系统
InitSysCtrl();

//禁用全局中断
颜色;

//禁用 IER 中的中断并清除 IFR
IER = 0x0;
IFR = 0x0;

//初始化外设(Init PIE 控制函数)、以清除 IER 寄存器和 IFR 寄存器中的标志
InitPieCtrl();

//初始化 PIE 矢量
InitPieVectTable();

//将我们的 ISR 地址分配给向量表元素
EALLOW;
PieVectTable。 EPWM1_INT = epwm1_ISR;
/* PieVectTable。 EPWM2_INT = epwm2_ISR;*/
EDIS;

//配置 EPWM1
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;// enabling epwm1 clock。
EDIS;
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//0 =向上计数
EPwm1Regs.TBCTL.bit.FREE_SOFT = 2;// 1X 表示自由运行
//现在有了60MHz 时钟。 (由于 HSPCLKDIV 分频器默认为1)

EPwm1Regs.TBPRD = 15000 - 1;//(1/4000)/(1/60e+6)= 15000 --> 60MHz 上的2000Hz 周期

EPwm1Regs.ETSEL.bit.INTEN = 1;// Enable ePWM interrupt (启用 ePWM 中断)
EPwm1Regs.ETSEL.bit.INTSEL = 1;// PWM 周期结束/开始

EPwm1Regs.ETPS.bit.INTPSSEL = 0;
EPwm1Regs.ETPS.bit.INTPRD = 1;//在每个 PWM 周期中生成中断。

/*
//配置 EPWM2
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;//启用 epwm2时钟。
EDIS;

EPwm2Regs.TBCTL.bit.CTRMODE = 0;//0 =向上计数
EPwm2Regs.TBCTL.bit.FREE_SOFT = 2;// 1X 表示自由运行
//现在有了60MHz 时钟。 (由于 HSPCLKDIV 分频器默认为1)

EPwm2Regs.TBPRD = 30000 - 1;//(1/2000)/(1/60e+6)= 30000 --> 60MHz 上的2000Hz 周期

EPwm2Regs.ETSEL.bit.INTEN = 1;// Enable ePWM interrupt (启用 ePWM 中断)
EPwm2Regs.ETSEL.bit.INTSEL = 1;// PWM 周期结束/开始

EPwm2Regs.ETPS.bit.INTPSSEL = 0;
EPwm2Regs.ETPS.bit.INTPRD = 1;//在每个 PWM 周期中生成中断。
*/


//在 PIE 模块中启用相应的中断

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//pwm1
/* PieCtrlRegs.PIEIER3.bit.INTx2 = 1;*/// pwm2

//在 GLOBAL IER 寄存器中启用中断。
IER |= M_INT3;//组3如上(pieier3)
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;不工作
//启用全局中断
EINT;

//设置 GPIO 引脚
EALLOW;
GpioCtrlRegs.GPAGMUX2.bit.GPIO22 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO22 = 1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO20 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;
GpioCtrlRegs.GPAAMSL.bit.GPIO20 = 0;//gpio20默认处于模拟模式。 模拟模式
EDIS;

//无限循环
for (;;);
}


_interrupt void
epwm1_isr (void)

//操作
if (f1 => 0)

GpioDataRegs.GPASET.bit.GPIO22 = 1;
}
设计

GpioDataRegs.GPACLEAR.bit.GPIO22 = 1;
}
f1 ^= 1;
T1++;

//清理

EPwm1Regs.ETCLR.bit.INT = 1;// Clear the ePWM interrupt (清除 ePWM 中断)

PieCtrlRegs.PIEACK.bit.ACK3;//确认 Grp3中断。
}

_interrupt void
epwm2_isr (空)

//操作
if (f2 =0)

GpioDataRegs.GPASET.bit.GPIO20 = 1;
}
设计

GpioDataRegs.GPACLEAR.bit.GPIO20 = 1;
}
F2 ^= 1;
T2++;
//清理

PieCtrlRegs.PIEACK.bit.ACK3;//确认 Grp3中断。
EPwm2Regs.ETCLR.bit.INT = 1;// Clear the ePWM interrupt (清除 ePWM 中断)

}

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

    嗨、Dev、

    您能否尝试使用指令 EPWM_clearEventTriggerInterruptFlag (EPWM1_BASE); 请参考 C2000ware 示例中可用的 interruot_ex4_EPWM_realtime_interrupt 中的以下代码。 (位于 C:\ti\c2000\C2000Ware_5_02_00_00\driverlib\f28003x\examples\interrupt)

    _interrupt void
    epwm1ISR (空)

    EPwm1TimerIntCount++;
    LEDcount++;

    //
    //当计数达到500时切换 LED2
    //
    如果(LEDcount = 500)

    GPIO_togglePin (DEVICE_GPIO_PIN_LED2);
    LEDcount=0;
    }

    //
    //清除此计时器的 INT 标志
    //
    EPWM_clearEventTriggerInterruptFlag (EPWM1_BASE);

    //
    //确认该中断以接收来自组3的更多中断
    //
    interrupt_clearACKGroup (INTERRUPT_ACK_GROUP3);
    }

    谢谢

    Srikanth