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

Guru**** 2595805 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1216184/lp-am243-finding-out-which-pin-a-gpio-interrupt-was-triggered-on

器件型号:LP-AM243
"Thread:SysConfig"中讨论的其他器件

SDK 版本:8.5.0.24

CCS 版本:12.2.0.00009

SysConfig 版本:1.15.0

我目前正在从事一个需要在八个独立的 GPIO 引脚上注册中断的项目。 我尝试修改了 SDK 示例 GPIO_input_interrupt_am243x-lp_r5fss0-0_nortos_ti-arm-clang 为了使用 GPIO 引脚 GPIO1_[0..6]以及引脚 GPIO1_8、我们HwiP_Object为每个引脚构造了一个单独的实例。 此HwiP_Params.args字段设置为向 ISR 提供相应的引脚编号、方法与示例中执行的方法完全相同。

但是、我发现每次调用 ISR 时、ARGS 都具有寄存了中断的最终引脚编号的值、这意味着如果引脚 GPIO1_0是要注册的最终引脚、则 ISR 将始终传递为0、 如果 GPIO1_8是最终引脚、则 ISR 将始终通过8。

浏览了 SDK 文档后、我认为这与中断路由器有关、并且如果我可以为每个引脚分配一个单独的中断路由器输出索引、那么就可以单独指定 ISR 参数和/或回调。 我设法修改了 SYSFW 资源管理映射-部分是通过试错的、因为 SDK 文档在这方面似乎并不完整。 遗憾的是、这尚未解决我的问题。

我感觉我有部分正确-中断路由器输出允许用户指定单独的中断参数、但仅限于存储体级别。 各个 GPIO 引脚将始终为其组注册的 ISR 参数提供。 这与以下事实是一致的tisci_msg_rm_irq_set_req.src_indexSciclient_rmIrqSet():传递到的结构的字段似乎只关心 GPIO 组索引、而不关心引脚编号、如示例代码所示:

// ti_drivers_config.c, line 92, auto-generated by SysConfig
rmIrqReq.src_index = TISCI_BANK_SRC_IDX_BASE_GPIO1 + GPIO_GET_BANK_INDEX(54);

问题1:情况是这样吗? 如果不是、请纠正。

问题2:如果是这种情况、找出在 ISR 内部触发中断的引脚的最佳方法是什么? 通过GPIO_getBankIntrStatus()在 ISR 内部调用并检查哪些位为1、似乎可以根据组(至少在我的本例中、所有引脚都驻留在组0中)来实现这一点。 我不确定这种方法是否足够可靠。

非常感谢您的观看!

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

    您好、Nestor Hiebl、

    1. 我认为这不是中断路由器的问题,为了进一步确认这是情况还是与您的实施有关, 是否有任何方式可以共享代码片段和您的 syscfg 配置。  

    2.我认为没有任何直接的 API 来获取触发中断的管脚编号,在中断时,相应的 GPIO 信号位会在寄存器中设置,所以你可以用自己的方法找出它。

    同时、您可能会发现以下内容很有用:
    您好,是否可以通过某种方法来判断常规 GPIO 中的哪个引脚会触发中断? -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    Br、
    Shaunak

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

    您好、感谢您的回答!

    我将继续根据组中断状态计算中断引脚、但仍想知道是否可以将中断路由器配置为路由单个引脚而不是组。

    以下是设置 GPIO 中断的代码。 原谅的格式,插入代码块似乎不适合我目前:

    #define NUM_UDI_CONNECTIONS 8

    const uint32_t udi_pin_nums[NUM_UDI_CONNECTIONS] = { /* GPIO pin num macros */ };
    const uint32_t udi_pin_base_addresses[NUM_UDI_CONNECTIONS] = { /* GPIO base address macros */ };
    const uint32_t udi_pin_dirs[NUM_UDI_CONNECTIONS] = { /* GPIO pin direction macros */ };
    const uint32_t udi_pin_trig_types[NUM_UDI_CONNECTIONS] = { /* GPIO trigger type macros */ };
    const uint32_t gpio_router_output_indices[NUM_UDI_CONNECTIONS] = { /* GPIOMUX_INTROUTER0 outputs 0 to 7 */ };

    HwiP_Object gpio_hwi_objects[NUM_UDI_CONNECTIONS];

    void gpio_input_interrupt_main() {
        HwiP_Params hwi_prms[NUM_UDI_CONNECTIONS];
        for (int i = 0; i < NUM_UDI_CONNECTIONS; i++) {
            uint32_t pin_addr   = (DWORD) AddrTranslateP_getLocalAddr(udi_pin_base_addresses[i]);
            uint32_t bankNum    = GPIO_GET_BANK_INDEX(udi_pin_nums[i]);
        
            GPIO_setDirMode(pin_addr, udi_pin_nums[i], udi_pin_dirs[i]);
            GPIO_setTrigType(pin_addr, udi_pin_nums[i], udi_pin_trig_types[i]);
            GPIO_bankIntrEnable(pin_addr, bankNum);

            /* Register pin interrupt */
            HwiP_Params_init(&hwi_prms[i]);
            hwi_prms[i].intNum   = gpio_router_output_indices[i];
            hwi_prms[i].callback = &UdiIsrFxn;
            /* I would expect the result of this to be that every pin is handed the
             * appropriate value of i (0-7) in its ISR. This is not the case - all
             * pins are handed 7 */
            hwi_prms[i].args     = (void *) i;
            /* There is a separate HwiP_Object instance for each pin that is kept
             * in memory for as long as the interrupt mapping are needed. */
            int32_t retVal    = HwiP_construct(&gpio_hwi_objects[i], &hwi_prms[i]);
            DebugP_assert(retVal == SystemP_SUCCESS );
        }
    }

    在以下函数中的其他位置处理 Sciclient GPIO 资源管理:

    static void Sciclient_gpioIrqSet(uint32_t interrupt_source_index, uint32_t router_output_index)
    {
    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 + (uint16_t) GPIO_GET_BANK_INDEX(interrupt_source_index);
    rmIrqReq.dst_id = TISCI_DEV_R5FSS0_CORE0;

    /* The parameter router_output_index is a macro from <drivers/hw_include/cslr_soc.h>, one of
    * CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_<0..7>. Note that calling this function
    * more than one time for GPIO pins within the same bank causes the call to Sciclient_rmIrqSet()
    * to fail. This leads me to believe that GPIO interrupt routing can only take place on the
    * bank level, not the pin level. */
    rmIrqReq.dst_host_irq = router_output_index;
    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 for GPIO pin index %ld\r\n", interrupt_source_index);
    DebugP_assert(FALSE);
    }

    return;
    }

    SysConfig 配置以 zip 文件形式附加。

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

    您好、Nestor、

    遗憾的是、没有直接的方法将中断路由器映射到引脚而不是组。

    我建议的是、在 am243x 上、我们有9个组、每组都有16个 GPIO 引脚。

    因此、在您的用例中、如果可能、您可以从8个不同的组中使用1个引脚。

    然后使用  GPIO_getBankIntrStatus () API 调用来获取正在使用的全部8个不同组的状态。 不确定这对于您的用例是否可行。

    但限制了中断路由器只能映射到寄存器组。

    Br、

    Shaunak

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

    非常感谢-意识到这一局限性、找到可行的解决方案将会容易得多。

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

    此外、您还可以参考类似的主题:


    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1184311/faq-mcu-plus-sdk-am263x-configuring-gpio-interrupts/4460313?tisearch=e2e-sitesearch&keymatch=FAQ%2525252525252520interrupts%2525252525252520am263#4460313

    Br、

    Shaunak