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.

[参考译文] AM2432:AM2432:ECAP 只输入一次中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1405584/am2432-am2432-ecap-only-enter-an-interrupt-once

器件型号:AM2432

工具与软件:

您好、TI

我们使用 ECAP 来捕获编码器信号、但测试发现它只进入一次中断、这是我的配置和中断函数:

/* ECAP Interrupt Sources */
#define ECAP_INT_ALL                    (ECAP_CEVT1_INT  | \
                                         ECAP_CEVT2_INT  | \
                                         ECAP_CEVT3_INT  | \
                                         ECAP_CEVT4_INT  | \
                                         ECAP_CNTOVF_INT | \
                                         ECAP_PRDEQ_INT  | \
                                         ECAP_CMPEQ_INT)

uint32_t gEcapBaseAddr = CONFIG_ECAP0_BASE_ADDR;
static HwiP_Object gEcapHwiObject;

void hal_ecap_it_cb(void *args)
{
    uint32_t fall = 0;
    uint32_t rise = 0;

    ECAP_intrStatusClear(gEcapBaseAddr, ECAP_INT_ALL);

    fall = ECAP_timeStampRead(gEcapBaseAddr, ECAP_CAPTURE_EVENT_2);
    rise = ECAP_timeStampRead(gEcapBaseAddr, ECAP_CAPTURE_EVENT_1);
    /* todo */
}

int32_t hal_ecap_init(void)
{
    HwiP_Params hwiPrms;

    /* Disable and Clear Interrupts */
    ECAP_intrDisable(gEcapBaseAddr, ECAP_INT_ALL);
    ECAP_intrStatusClear(gEcapBaseAddr, ECAP_INT_ALL);
    /* Disable CAP1-CAP4 register loads */
    ECAP_captureLoadingDisable(gEcapBaseAddr);
    /* Configure eCAP */
    ECAP_counterControl(gEcapBaseAddr, ECAP_COUNTER_STOP);

    /* Enable capture mode */
    ECAP_operatingModeSelect(gEcapBaseAddr, ECAP_CAPTURE_MODE);

    ECAP_continuousModeConfig(gEcapBaseAddr);

    ECAP_counterConfig(gEcapBaseAddr, 0);

    /* Set polarity of the events to falling, rising, falling, rising edge */
    ECAP_captureEvtPolarityConfig(gEcapBaseAddr,
                                  ECAP_CAPTURE_EVENT_RISING,
                                  ECAP_CAPTURE_EVENT_FALLING,
                                  ECAP_CAPTURE_EVENT_RISING,
                                  ECAP_CAPTURE_EVENT_FALLING);

    /* Set capture in time difference mode */
    ECAP_captureEvtCntrRstConfig(gEcapBaseAddr,
                                 ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
                                 ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
                                 ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
                                 ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET);

    ECAP_syncInOutSelect(gEcapBaseAddr, ECAP_SYNC_IN_DISABLE, ECAP_SYNC_OUT_DISABLE);

    /* Register & enable ICSSG EnDat PRU FW interrupt */
    HwiP_Params_init(&hwiPrms);
    hwiPrms.intNum      = CONFIG_ECAP0_INTR;
    hwiPrms.callback    = hal_ecap_it_cb;
    hwiPrms.args        = 0;
    hwiPrms.isPulse     = CONFIG_ECAP0_INTR_IS_PULSE;
    hwiPrms.isFIQ       = FALSE;
    HwiP_construct(&gEcapHwiObject, &hwiPrms);

    ECAP_prescaleConfig(gEcapBaseAddr, 0);
    ECAP_counterControl(gEcapBaseAddr, ECAP_COUNTER_FREE_RUNNING);
    /* Enable eCAP module */
    ECAP_captureLoadingEnable(gEcapBaseAddr);
    /* Enable interrupt */
    ECAP_intrEnable(gEcapBaseAddr, ECAP_CEVT2_INT);

    return 0;
}

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

    您好、我们的专家目前不在办公室、请允许他在几天内再次与您联系。 如果您尚未得到回复、请在星期五之前 Ping 此主题。

    同时,你可以检查几件事(如果你还没有)。

    -中断清除了吗?

    /*清除 ECAP 中断。 */
    ECAP_IntrStatusClear(gEcapBaseAddr、ECAP_INT_ALL);
    /*清除全局中断标志。 */
    ECAP_globalIntrClear(gEcapBaseAddr);

    -可以运行 MCU+SDK ECAP 开箱即用的示例吗?

    AM243x MCU+ SDK:ECAP APWM 模式(TI.com)

    谢谢!

    Paula.

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

     通过运行输出箱示例、但输出箱 示例也是单触发中断、因此我无法验证连续触发。

    谢谢你。

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

    尊敬的 Walker。

    我想您需要像 SDK 中的示例那样清除全局中断标志。

    C:\ti\mcu_plus_sdk_am243x_09_02_01_05\examples\drivers\ecap\ECAP_EPWM_loopback\ECAP_EPWM_loopback.c

    静态 void App_ecapIntrISR (void *arg)

    /*清除 ECAP 中断。 */
    ECAP_IntrStatusClear (gEcapBaseAddr、ECAP_INT_ALL);
    /*清除全局中断标志。 */
    ECAP_globalIntrClear (gEcapBaseAddr);

    SemaphoreP_POST (&G);
    }

    正如您之前提到的、您正在 TRM 12.4.2.5.3章节中尝试此案例。

    12.4.2.5.3时间差(Δ)运行上升沿触发示例

    另请查看以下建议。

    1.需要将 CTRSTx 位设置为1。

    /*在时间差模式下设置捕获*/
    ECAP_captureEvtCntRstConfig (gEcapBaseAddr、
    ecap_capture_event_reset_counter_reset、
    ecap_capture_event_reset_counter_reset、
    ecap_capture_event_reset_counter_reset、
    ecap_capture_event_reset_counter_reset);

    周期为 CEVT1~CETV4、  

      ECAP_intrEnable (gEcapBaseAddr、ECAP_CEVT4_INT);

    非常感谢!

    Yong

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

    尊敬的 Walker。

    我可以问您是否修复了该问题吗?

    请帮助提供更新。

    非常感谢!

    Yong

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

    抱歉、忘记回复。 是的、最后的答复解决了我的问题、非常感谢。