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.

LP-AM243: GPIO interrupts not working

Part Number: LP-AM243

Tool/software:

Hi Ti

I configured a GPIO input interrupt in the  mcu_plus_sdk_am243x_09_02_01_05/i2c_read_am243x-lp_r5fss0-0_freertos_ti-arm-clang demo following the mcu_plus_sdk_am243x_09_02_01_05/gpio_input_interrupt_am243x-lp_r5fss0-0_nortos_ti-arm-clang demo, but it didn't work.The external input is periodically generating a level change, but the interrupt callback function is not running.

This is my syscfg,

This is GPIO related code

/* ti_drivers_config.h */

/* GPIO PIN Macros */
#define GPIO_IMU_INIT_BASE_ADDR (CSL_GPIO1_BASE)
#define GPIO_IMU_INIT_PIN (6)
#define GPIO_IMU_INIT_DIR (GPIO_DIRECTION_INPUT)
#define GPIO_IMU_INIT_TRIG_TYPE (GPIO_TRIG_TYPE_RISE_EDGE)
#define GPIO_IMU_INIT_INTR_NUM     (CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_5)
#define CONFIG_GPIO_NUM_INSTANCES (1U)

/*------------------------------------*/
/* ti_drivers_config.c */

 /*
 * Board info
 */
/* This is based on DMSC board config and core */
#define BOARD_BUTTON_GPIO_INTR_NUM      (CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_5)

#define BOARD_BUTTON_GPIO_SWITCH_NUM    (5)

static void Sciclient_gpioIrqSet(void)
{
    int32_t                             retVal;
    struct tisci_msg_rm_irq_set_req     rmIrqReq;
    struct tisci_msg_rm_irq_set_resp    rmIrqResp;
    rmIrqReq.valid_params           = 0U;
    rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
    rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event           = 0U;
    rmIrqReq.src_id                 = TISCI_DEV_GPIO1;
    rmIrqReq.src_index              = TISCI_BANK_SRC_IDX_BASE_GPIO1 + GPIO_GET_BANK_INDEX(6);
    rmIrqReq.dst_id                 = TISCI_DEV_R5FSS0_CORE0;
    rmIrqReq.dst_host_irq           = CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_5;
    rmIrqReq.ia_id                  = 0U;
    rmIrqReq.vint                   = 0U;
    rmIrqReq.vint_status_bit_index  = 0U;
    rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;

    retVal = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, SystemP_WAIT_FOREVER);
    if(0 != retVal)
    {
        DebugP_log("[Error] Sciclient event config failed!!!\r\n");
        DebugP_assert(FALSE);
    }
    return;
}

static void Sciclient_gpioIrqRelease(void)
{
    int32_t                             retVal;
    struct tisci_msg_rm_irq_release_req rmIrqReq;
    rmIrqReq.valid_params           = 0U;
    rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
    rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
    rmIrqReq.global_event           = 0U;
    rmIrqReq.src_id                 = TISCI_DEV_GPIO1;
    rmIrqReq.src_index              = TISCI_BANK_SRC_IDX_BASE_GPIO1 + GPIO_GET_BANK_INDEX(6);
    rmIrqReq.dst_id                 = TISCI_DEV_R5FSS0_CORE0;
    rmIrqReq.dst_host_irq           = CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_5;
    rmIrqReq.ia_id                  = 0U;
    rmIrqReq.vint                   = 0U;
    rmIrqReq.vint_status_bit_index  = 0U;
    rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;

    retVal = Sciclient_rmIrqRelease(&rmIrqReq, SystemP_WAIT_FOREVER);
    if(0 != retVal)
    {
        DebugP_log("[Error] Sciclient event reset failed!!!\r\n");
        DebugP_assert(FALSE);
    }
    return;
}

/*------------------------------------*/
/* user_code.c */
void GPIO_bankIsrFxn(void *args)
{
    uint32_t    pinNum = (uint32_t) args;
    uint32_t    bankNum =  GPIO_GET_BANK_INDEX(pinNum);
    uint32_t    intrStatus, pinMask = GPIO_GET_BANK_BIT_MASK(pinNum);

    /* Get and clear bank interrupt status */
    intrStatus = GPIO_getBankIntrStatus(gGpioBaseAddr, bankNum);
    GPIO_clearBankIntrStatus(gGpioBaseAddr, bankNum, intrStatus);
    DebugP_log("GPIO_bankIsrFxn\r\n");
}

void gpio_int_init(void)
{
    int32_t         retVal;
    uint32_t        pinNum, intrNum, buttonNum;
    Board_gpioInit();
    HwiP_Params     hwiPrms;

    pinNum          = GPIO_IMU_INIT_PIN;
    intrNum         = Board_getGpioButtonIntrNum();
    buttonNum       = Board_getGpioButtonSwitchNum();


    /* Address translate */
    gGpioBaseAddr = (uint32_t) AddrTranslateP_getLocalAddr(gGpioBaseAddr);

    /* Register pin interrupt */
    HwiP_Params_init(&hwiPrms);
    hwiPrms.intNum   = intrNum;
    hwiPrms.callback = &GPIO_bankIsrFxn;
    hwiPrms.args     = (void *) pinNum;
    retVal = HwiP_construct(&gGpioHwiObject, &hwiPrms);
    DebugP_assert(retVal == SystemP_SUCCESS );

}

  • Hello P Zy,

    Thanks for your query.

    Can you please tell, are you using DebugP_log API prints to confirm that ISR is running or not?

    If you are using the above method it won't give you the debug logs because the above API doesn't work in Interrupt context(i.e. in ISR).

    Please refer below screenshot.

      

    Instead you should use a global variable, increment the count and print it outside the ISR to confirm ISR occurred or not.

    Hope the above information helps.

    Regards,

    Tushar

  • Thank ! Thakur it is work!