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 中断)
}