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.

28379D Ecap中断触发延时 捕获外部脉冲上升沿 延时太长

DSP28379D在调用DSP内部Ecap 脉冲捕获功能时,如下图所示CH4绿色通道是我DSP外部的GPIO口给到Ecap模块进行捕获的方波,CH3是DSP捕获到CH4脉冲上升沿触发Ecap中断程序后实现GPIO口的翻转来测试Ecap的延时时间,为什么会有260ns的延时时间啊?

目前系统时钟配置为200MHz, datasheet上关于GPIO的延时采5个系统时钟周期以内,260ns太长了不正常啊,我现在要用到1MHz以上的开关频率,这个延时太大了无法接受啊


 

  • “CH3是DSP捕获到CH4脉冲上升沿触发Ecap中断程序后实现GPIO口的翻转来测试Ecap的延时时间”

    中断的触发,中断程序的执行以及GPIO反转都是需要时间的。

    请问能否给出详细代码?
  • void Ecap_Init(void)
    {

    EALLOW;
    InputXbarRegs.INPUT7SELECT = 21; // Set eCAP1 source to GPIO-pin
    EDIS;

    GPIO_SetupPinOptions(21, GPIO_INPUT, GPIO_ASYNC);

    ECap1Regs.ECEINT.all = 0x0000; // Disable all capture __interrupts
    ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP __interrupt flags
    ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped

    // Configure peripheral registers
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // One-shot
    ECap1Regs.ECCTL2.bit.STOP_WRAP = 0;//3; // Stop at 4 events
    ECap1Regs.ECCTL1.bit.CAP1POL = 0; // Falling edge
    ECap1Regs.ECCTL1.bit.CAP2POL = 0; // Rising edge
    ECap1Regs.ECCTL1.bit.CAP3POL = 0; // Falling edge
    ECap1Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
    ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation
    ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
    ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
    ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
    ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // Enable sync in
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; // Pass through
    ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
    ECap1Regs.ECCTL2.bit.REARM = 1; // arm one-shot
    ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
    ECap1Regs.ECEINT.bit.CEVT1 = 1; // 1 events = __interrupt
    // ECap1Regs.ECEINT.bit.CEVT4 = 1; // 4 events = __interrupt

    }/* Ecap_Init() */


    interrupt void ecap1_isr(void)
    {

    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO12 = 1;
    EDIS;
    ECap1Regs.ECCLR.bit.CEVT1 = 1;

    ECap1Regs.ECCLR.bit.INT = 1;
    ECap1Regs.ECCTL2.bit.REARM = 1;

    // Acknowledge this __interrupt to receive more __interrupts from group 4
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

    GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;

    }