Thread 中讨论的其他器件:controlSUITE
大家好、
我尝试通过 ECAP 中断触发 CLA 任务。 我的 ADC 中断可以触发 CLA、但我不知道我在 ECAP/CLA 配置中做了什么错误。
这是我的 CLA 中断配置。
静态内联 void Init_cla_Interrupt (void)
{
EALLOW;
// CLA 的软复位-在软复位之后、必须等待至少1个 SYSCLKOUT 周期、然后再重新配置 MIER 位。
Cla1Regs.MCTL.bit.SOFTRESET = ON;
//不需要配置 CLA1TASSKSRCSELLOCK 寄存器,只分配任务一次
//将触发器设置为 CLA 任务
// AdcDrv 将 ADC 中断(每个 ADC 最多4个)分配给不同的 ADC 通道(每个 ADC 16个)
DmaSrcCLA.1TABLET.CLA1_ECTAG.CLA = CLA1TTREST.TAG_CLA
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task2 = CLA_TRIG_ADCAINT1;
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK3 = CLA_TRIG_ADCDINT1;
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK4 = CLA_TRIG_EPWM2INT;
DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK5 = CLA_TRIG_SD1INT;
DmaClaSrcSelRegs.CLA1TASSKSRCSEL2.bit.TASK8 = CLA_TRIG_NOPERPH;
//为 CLA 任务设置指针
Cla1Regs.MVECT1 =(UL)(Cla1Task1);
Cla1Regs.MVECT2 =(UL)(Cla1Regs.MVECT3
);Cla1Regs.MVECT3 =(UL)(Cla1Task3);
Cla1Regs.MVECT4 =(UL)(Cla1Reg4);Cla1MVECT5
=(Cla1Reg5);Cla1Regt5 (UL);Cla1Regt5 (Cla1Regt5)
Cla1Regs.MVECT8 =(UL)(Cla1Task8);
//为所有8个 CLA 任务设置中断使能
Cla1Regs.MIER = 0xFF;
EDIS;
EALLOW;
//清除所有旧的中断标志
Cla1Regs.Clalr.all = 0xFF;
//清除旧的旧的标志 MICRO1Regs.MicroCLS.Cltask.all
= 0xFF;
//为所有任务配置
中断向量
PieVectTable.CLA1_2_INT = endOfClaIsr;
PieVectTable.CLA1_3_INT = endOfClaIsr;
PieVectTable.CLA1_4_INT = endClaResetIsr;
PieVectTable.CLA1_5_INT = endOfClaIsr;
PieVectTable.CLA1_8_INT = endOfClaInitIsr;
//在组和子组级别启用 CLA 中断
PieCtrlRegs.PIEIER11.all = 0xFFFF;//启用组11
IER 中的所有中断|=(M_INT11); //启用组11
// CLA 直接访问中断,而不是通过 PIE 访问(C2000 CLA 常见问题解答)
//在组和子组级别为 ECAP 启用 CLA 中断
// PieCtrlRegs.PIEIER4.all = 0xFFFF;//启用组4中的所有中断
// IER ||=(M_INT4); //启用组4
EDIS;
EALLOW;
//通过软件中断初始化 CLA 变量到 CLA 任务8
Cla1Regs.MIFRC.bit.INT8 = ON;
asm (" RPT #3 || NOP");
while (Cla1Regs.MIRUN.bit.INT8 = 1);
EDIS;
}
这里是我的 ECAP 配置。
void Init_CaptureDrv (void) { US 模块=(US) ECAP_DRV_MODULE_1; UL 周期= 0U; EALLOW; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //// Pinmux 配置 GPIO25 => J6引脚51;OUTPUTXBAR2 // OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX8 = 3U; // MUX8 => ECAP5OUT // OutputXbarRegs.OUTPUT2MUXENABLE.bit.MUX8 =打开; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////eCAP //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //// GPIO95 => J5引脚42 // GpioCtrlRegs.GPCPUD.bit.GPIO95 =关闭;//上拉使能 // GpioCtrlRegs.GPCDIR.bit.GPIO95 =关闭;//输入 // InputXbarRegs.INPUT7SELECT = 关闭;// INPUTCL0C.INTRU.INTRU.INTRU.INTRIP.INTRU.INTRCK =关闭 //影子寄存器 UL sRegCTRPHS = 0x00000000; //影子寄存器计数器阶段 UL sRegCAPx = 0x00000000; //影子寄存器 CAPx 美国 sRegECEINT = 0x0000; //影子寄存器中断使能(EALLOW) 美国 sRegECFLG = 0x0000; //影子寄存器中断标志 美国 sRegECCLR = 0x0000; //影子寄存器中断清除 美国 sRegECFRC = 0x0000; //影子寄存器中断强制 对于(MODULE =(US) ECAP_DRV_MODULE_1;MODULE <=(US) ECAP_DRV_MODULE_4;MODULE++) { //配置为捕获 eCapDrv.pRegsECAP[模块]->ECCTL2.bit.CAP_APWM =关闭; //禁用 CAP1-CAP4寄存器载入并确保计数器被停止 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CAPLDEN =关闭; eCapDrv.pRegsECAP[模块]->ECCTL2.bit.TSCTRSTOP =关闭; //将计数器相位设置为0 eCapDrv.pRegsECAP[模块]->CTRPHS = sRegCTRPHS; //将 ECAP 寄存器初始化为0 eCapDrv.pRegsECAP[模块]->CAP1 = sRegCAPx; //禁用中断和清除标志 eCapDrv.pRegsECAP[模块]->ECEINT.ALL = sRegECEINT; eCapDrv.pRegsECAP[模块]->ECFLG.ALL = sRegECFLG; eCapDrv.pRegsECAP[模块]->ECCLR.ALL = sRegECCLR; eCapDrv.pRegsECAP[模块]->ECFRC.ALL = sRegECFRC; //确定周期和占空比的两个上升沿和两个下降沿 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.free_soft = 3U; // TSCTR 自由运行 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CAP1POL =关闭; //上升沿 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CAP2POL =开; //下降沿 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CAP3POL =关闭; //上升沿 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CAP4POL =开; //下降沿 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CTRST1 =打开; //差动运算 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CTRST2 =打开; //差动运算 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CTRST3 =打开; //差动运算 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CTRST4 =打开; //差动运算 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.prescale =关闭; //不使用预分频器 //同步 eCapDrv.pRegsECAP[模块]->ECCTL2.bit.SYNCI_EN =开; //启用同步输入 eCapDrv.pRegsECAP[模块]->ECCTL2.bit.SYNCO_SEL =关闭; //同步输入被传递到同步输出 eCapDrv.pRegsECAP[模块]->ECCTL1.bit.CAPLDEN =开; //启用捕捉单元 eCapDrv.pRegsECAP[模块]->ECCTL2.bit.tSCTRSTOP =开; //开始计数器 eCapDrv.pRegsECAP[模块]->ECCTL2.bit.rearm =开; // Arm One-Shot eCapDrv.pRegsECAP[模块]->ECCTL2.bit.CONT_ONESHT =关闭; //连续操作模式 } //配置 APWM 周期=(UL) CLKDRV_SYSCLKOUT_MHz /(UL) SDCLK_FREQ_MHz; eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.CAP_APWM =开; // eCap5用作 APWM eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.SYNCI_EN =关闭; //禁用同步输入选项 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.SYNCO_SEL = 3U; //禁用同步输出信号 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP1 =(周期- 1U);// UL 设置周期值 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP2 =(周期/2U - 1U);// UL 设置比较值 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP3 =(周期- 1U);// UL 设置周期值 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP4 =(周期/2U - 1U);// UL 设置比较值 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCLR.ALL = 0xFF; //清除暂挂的__interrupts。 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL1.bit.FREE_SOFT = 3U; // TSCTR 计数器不受仿真挂起(自由运行)的影响 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL1.bit.prescale =关闭; //无预分频 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.TSCTRSTOP =开; //时间戳计数器自由运行 //调试 eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECEINT.BIT.CTR_EQ_PRD =开; // CTR 上的中断= PRD EDIS; //启用写保护 }
指示中断弹出的标志:
我还在 C2000常见问题解答中发现、CLA 中断不会通过 PIE、而是可以直接触发任务。 我看不到这种情况发生了。 感谢您的任何帮助!
谢谢!
Alex