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.

[参考译文] AM623:如何设置 GPIO IRQ 处理程序

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1517157/am623-how-to-setup-gpio-irq-handler

器件型号:AM623
《ADS131A04 与集成概述》中讨论的其他器件》

工具/软件:

您好:

我将 3 个 ADS131A04 器件以菊花链方式连接到 AM623 电路板;第一个器件处于异步中断模式、其他两个器件处于同步从模式。 所有 DRDY 引脚都连接到 GPIO MCU_UART0_CTSn (A6)。 我尝试将该引脚设置为在 DRDY 信号数据可用时触发中断。 我遵循 examples/drivers/gpio/gpio_input_interrupt 中的 SDK 示例。 我的代码:


GPIO_setDirMode (gGpioBaseAddr、pinNum、GPIO_DIRECTION_INPUT);
GPIO_setTrigType (gGpioBaseAddr、pinNum、GPIO_TRIG_TYPE_FALL_EDGE);
GPIO_bankIntrEnable (gGpioBaseAddr、bankNum);

然后、在回调注册函数中、我得到以下值:

  //*寄存器引脚中断*/
  HwiP_Params hwiPrms;
  HwiP_Params_init (&hwiPrms);
  hwiPrms.intNum = 0
  hwiPrms.callback =(void *)&CB
  hwiPrms.args =(void *) 引脚
  结果= HwiP_Construct (&gGpioHwiObject、&hwiPrms);
我不知道要在 hwiPrms.intNum 中输入什么内容、 但这似乎行不通。  
这是否是为 GPIO 引脚注册 ISR 回调的正确方法? 谢谢。
-艾曼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ayman:

    您能否说明您使用的 MCU+SDK 是哪个版本?

    此外、您是否尝试通过 GPIO 为哪个内核生成中断?

    我不确定在 hwiPrms.intNum 中放什么内容、 但这似乎不起作用。  [/报价]

    有关此信息、请检查器件 TRM 中内核的中断连接表。

    下面是 A53 内核上 GPIO 中断连接的 TRM 屏幕截图。

    此致、

    Tushar

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

    感谢您的答复。

    我正在使用 MCU SDK 版本 10.01、并尝试向 MCU_GPIO0_7 上的 M4F 内核配置中断。

    -艾曼

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

    尊敬的 Ayman:

    我使用的是 MCU SDK 版本 10.01、我正在尝试在 MCU_GPIO0_7 上配置 M4F 内核的中断。

    感谢您的答复。

    请共享 Sciclient_gpioIrqSet() API 定义、以检查您在此处配置了哪些参数。

    此外、您还可以使用以下作为 hwiPrms.intNum。

    此致、

    Tushar

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

    您好、

    我不想再跟你说了,但你的建议对我很有效。 现在、我有关于引脚与组中断的问题。 现在、我只有一个注册中断的 GPIO 引脚 (MCU_GPIO0_7)、但需要注册第二个 GPIO、同一个 MCU 组。 我查看了此页面中的示例:

    AM64x MCU+ SDK:GPIO

    在我看来、引脚中断与组中断之间的代码唯一区别是我们为 hwiPrms.intNum:填写的内容

    hwiPrms.intNum = gGpioBankIntrNum;   //寄存器组中断

    hwiPrms.intNum = gGpioPinIntrNum;     // 寄存器引脚中断

    我在 gGpioBankIntrNum 和 gGpioPinIntrNum 的示例中看不到。 引脚与组是否有不同的值? 根据您的建议、我使用:

    hwiPrms.intNum = CSLR_MCU_M4FSS0_CORE0_NVIC_WKUP_MCU_GPIOMUX_INTROUTER0_OUTP_6 + 16U
    这是用于组中断还是引脚中断? 是否有注册两个中断 GPIO 的示例? 我是否需要为第二个 PIN 调用相同的代码并创建另一个  HwiP_Object?
    谢谢。
    -艾曼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ayman:

    我们提供了有关如何配置 GPIO 引脚中断的常见问题解答。 请参阅常见问题解答 4  GPIO 用例应用手册

    此致、

    Tushar

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

    感谢您的回答。 我查看了常见问题解答、但没有回答我的问题。 我的问题与组与引脚中断的代码有关。 如果您查看 AM64x MCU+ SDK 中的示例:GPIO、有一个设置引脚中断的示例、另一个设置组中断的示例。 这两种情况下的代码都是相同的、但“hwiPrms.intNum = intrNum;“中的值除外、这是我的问题。 是基于  hwiPrms.intNum?所用值的引脚与组中断 换言之、如何为组与引脚中断设置 GPIO。

    我看到了为中断配置多个 GPIO 的参考、但找不到代码示例。

    -艾曼

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

    尊敬的 Ayman:

    注册引脚中断或组中断的过程是相同的。 这就是为什么您不会发现文档中有任何差异的原因。

    默认情况下、该中断配置为组中断。 要使 IT 引脚中断、您需要修改  Sciclient_gpioIrqSet (void)  API。

     例如、我想在 MCU_GPIO0 上获得中断、因此源 ID 是 TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0:

    rmIrqReq.src_id = TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0;

    我希望为 MCU GPIO 引脚 15 生成中断。 数据表、以便为其获取引脚中断 MCU_GPIO0_15 、则源索引应为 15 。 有关 GPIO 中断源索引的更多详细信息、请参阅一章 10.1.5、“GPIO 中断处理“。

    rmIrqReq.src_index = 15u;

    请参阅下图。

    根据上述 GPIO 中断路由图中的 TRM、所有 MCU_GPIO 中断都专门路由到 M4 域、不与任何其他内核共享。 在这种情况下、目标 ID 将与源 ID 相同。 但是、如果中断与其他内核共享、则必须指定目标内核。

    rmIrqReq.dst_id = TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0;

    下一步是选择中断路由器寄存器、范围为 0 至 12。 我选择了  rmIrqReq.src_index 为 4u。 您可以使用$U、5U、6U 和 7U 中的任何 GPIO 路由器输出、因为这些输出会路由到 M4F 内核。 请参阅上图。

    rmIrqReq.src_index = 4u;

    希望以上内容得到澄清。

    此致、

    Tushar

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

    尊敬的 Tushar:

    感谢您的快速响应。 因此、我现在在引脚 MCU_GPIO0_7 上使中断正常工作、但在第二个引脚  MCU_GPIO0_14 上尚未正常工作。 两个引脚位于同一组 (CMU BANK_0) 中。 我的 Sciclient_gpioIrqSet() 中的设置如下:

      rmIrqReq.src_id         = TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0
      rmIrqReq.src_index      = SRC_IDX_BASE_GPIO_BANK;      //(30U)
      rmIrqReq.dst_id         = TISCI_DEV_WKUP_MCU_GPIOMUX_INTROUTER0
      rmIrqReq.DST_HOST_IRQ    = GPIOMUX_INTROUTER_OUTP;   //(6U)
    因此、我的 src 和 dst 是 M4F 内核。 我的 src_index 是 (30u)、它应该是组中断。 上述代码在 Board_init () 期间调用一次。
    当我注册引脚进行中断时、下面是我的代码:

      //*寄存器引脚中断*/
      HwiP_Params_init (&hwiPrms);
      hwiPrms.intNum = CSLR_MCU_M4FSS0_CORE0_NVIC_WKUP_MCU_GPIOMUX_INTROUTER0_OUTP_6 + 16U
      hwiPrms.callback =&GPIO_bankIsrFxn
      hwiPrms.args =(void *) 引脚
      结果= HwiP_Construct (&gGpioHwiObject、&hwiPrms);
    与第一个引脚配合良好。 当我注册第二个引脚时、我调用相同的代码设置 第二个  gGpioHwiObject 结构。 是这样吗? 如果是、hwiPrms.intNum 的两个引脚是否应该使用相同的值? 对于第一个引脚、  似乎只有 CSLR_MCU_M4FSS0_CORE0_NVIC_WKUP_MCU_GPIOMUX_INTROUTER0_OUTP_6 起作用。
    所以、我不知道注册第 2 个引脚会有什么问题。 另外、我对第 2 个引脚的注册有点困惑。 我对组中断的理解是、组中断处理程序将在组内的任何引脚上调用中断。 然后是中的中断状态位掩码  
    GPIO_getBankIntrStatus() 将指示中断发生在哪个引脚上。 我是否对此有所误解?
    再次感谢您的耐心。
    -艾曼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ayman:

    您是否尝试将一个引脚配置为组中断、将另一个引脚配置为与引脚中断位于同一组中?

    此致、

    Tushar

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

    否、只需将两个引脚配置为组中断、并使用  GPIO_getBankIntrStatus () 中的 IntrStatus 检查哪个引脚触发了中断。 当我调用代码来注册中断时,我使用的是相同的回调函数,即 gpio_bankIsrFxn ()。 在该函数中、我检查 IntrStatus、然后调用相应的引脚中断处理程序。

    我看到将两个引脚配置为引脚中断、但看起来像在 Sciclient_gpioIrqSet () 中将引脚中断配置为 src_index。 我可以用这里的第一个引脚来配置 src_index、但随后该函数只在 Board_init () 中调用一次。 当我调用代码来注册引脚中断时、我是否可以调用一次用于引脚 1、第二次用于引脚 2、从而传递不同的回调? 是否应该对 hwiPrms.intNum 使用不同的值?

    -艾曼

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

    尊敬的 Ayman:

    在该函数中、我检查 intraStatus、然后调用相应的引脚中断处理程序。

    是、这是使用组中断的正确过程。 您可以有单个中断回调、在该回调内部、您可以确定哪个引脚生成了中断并相应地进行处理。

    当我调用代码来注册引脚中断时、我是否可以调用一次用于引脚 1、第二次用于引脚 2

    是的、您可以通过为配置传递不同的参数来调用两次函数。 或者、您也可以在单个函数调用中配置双引脚中断、如下所示。

    请参阅以下代码。

    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                 = src_id;
        rmIrqReq.src_index              = pin_num1;
        rmIrqReq.dst_id                 = dst_id;
        rmIrqReq.dst_host_irq           = router_num1;
        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);
        }
        
        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                 = src_id;
        rmIrqReq.src_index              = pin_num2;
        rmIrqReq.dst_id                 = dst_id;
        rmIrqReq.dst_host_irq           = router_num2;
        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;
    }
    

    是否应该为 hwiPrms.intNum 使用不同的值?

    是的、对于每个引脚中断、您需要使用不同的中断编号和不同的路由器输出。

    希望以上内容有所帮助。

    此致、

    Tushar