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.

[参考译文] AM62P:AM62P:MCU R5 中的主域 GPIO 引脚中断

Guru**** 2928980 points

Other Parts Discussed in Thread: AM62P

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1653248/am62p-am62p-main-domain-gpio-pin-interrupt-in-mcu-r5

部件号: AM62P

您好、

我在 AM62P MCU 方面工作、 根据一个参考示例、我将一个主域 GPIO 配置为来自 MCU R5 的输入、并按预期运行。

我当前的要求是使用相同的主域 GPIO 作为中断源。

是否可以配置主域 GPIO 来为 MCU R5 内核生成中断?

我提到了 MCU+ SDK 中的 GPIO 中断示例、并尝试针对我的用例进行调整。 但是、我有一些疑问。

在示例中、我看到:



  PinNum      = GPIO_Push_putton_pin;
  IntrNum     = Board_getGpioButtonIntrNum ();
  bankNum     = GPIO_GET_BANK_INDEX (pinNum);

当我选中 Board_getGpioButtonIntrNum()时、它返回:

CSLR_MCU_R5FSS0_CORE0_CPU0_INTR_WKUP_MCU_GPIOMUX_INTROUTER0_OUTP_6

我的理解是、此中断源与 WKUP MCU GPIO 中断路由器有关。 这是否意味着该示例仅适用于 MCU/WKUP 域 GPIO、还是可以对主域 GPIO 中断使用类似的方法?

另外、在 board.c 中断示例中、我注意到了以下函数:

静态 void Sciclient_gpioIrqSet (void)

  int32_t               retVal;
  结构 tisci_msg_rm_irq_set_req rmIrqReq  ;
  结构 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         = MCU_GPIO_MUX_INTROUTER_ID;
  rmIrqReq.src_index        = SRC_IDX_BASE_MCU_GPIO_BANK_0;
  rmIrqReq.dst_id         = MCU_GPIO_MUX_INTROUTER_ID;
  rmIrqReq.DST_HOST_IRQ      = MCU_GPIOMUX_INTROUTER_OUTP;
  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_rmIrqSetRaw (&rmIrqREQ、&rmIrqResp、SystemP_WAIT_FOREVER);
  if (0!= retVal)
  {
    DebugP_log(“【错误】Sciclient 事件配置失败!!!\r\n“);
    DebugP_ASSERT (FALSE);
  }

  返回;
}

静态 void Sciclient_gpioIrqRelease (void)

  int32_t               retVal;
  结构 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         = MCU_GPIO_MUX_INTROUTER_ID;
  rmIrqReq.src_index        = SRC_IDX_BASE_MCU_GPIO_BANK_0;
  rmIrqReq.dst_id         = MCU_GPIO_MUX_INTROUTER_ID;
  rmIrqReq.DST_HOST_IRQ      = MCU_GPIOMUX_INTROUTER_OUTP;
  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_rmIrqReleaseRaw (&rmIrqREQ、SystemP_WAIT_FOREVER);
  if (0!= retVal)
  {
    DebugP_log(“【错误】Sciclient 事件重置失败!!\r\n“);
    DebugP_ASSERT (FALSE);
  }

  返回;
}

我不清楚他们的目的。
您能否说明主域 GPIO 中断应如何路由到 MCU R5、以及是否需要任何其他中断路由器配置?

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

    尊敬的 Abhijit:

    是否可以配置主域 GPIO 来为 MCU R5 内核生成中断?

    主域 GPIO 中断可路由到 MCU 域内核。  

    请参阅 TRM 的下图(表 4-174。 main_gpiomux_introuter 的硬件请求)、主 GPIOMUX 路由器中只有两台路由器可用、这两台路由器可以路由到 MCU 内核。

    如果将中断配置为 PIN 类型、则最多只能将两个引脚路由到 MCU 域、或者如果配置为组类型、则最多可以路由 32 个引脚。 如果配置为存储库类型、则来自同一存储库的所有引脚都将路由到单个路由器输出。

    在 MCU+SDK 中、检查 sciclient_defaultBoardCfg_rm.c 文件、默认配置显示路由器输出 34-35 路由到 MCU 域。

    请参阅下图。

    您能否说明应如何将主域 GPIO 中断路由到 MCU R5、以及是否需要任何其他中断路由器配置?

    您需要更改 Sciclient_gpioIrqSet/Release API、GPIO 中断才能正常工作。

    此致、

    Tushar

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

    需要进行以下更改。 修改 gpio_input_interrupt 示例中提供的 board.c 文件。

    #define BOARD_BUTTON_GPIO_INTR_NUM      (CSLR_MCU_R5FSS0_CORE0_CPU0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_34)
    #define MAIN_GPIO_MUX_INTROUTER_ID      (TISCI_DEV_MAIN_GPIOMUX_INTROUTER0)
    #define MAIN_GPIOMUX_INTROUTER_OUTP     (34U)
    
    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                 = MAIN_GPIO_MUX_INTROUTER_ID;
        rmIrqReq.src_index              = CSLR_MAIN_GPIOMUX_INTROUTER0_IN_GPIO0_GPIO_48;
        rmIrqReq.dst_id                 = MAIN_GPIO_MUX_INTROUTER_ID;
        rmIrqReq.dst_host_irq           = MAIN_GPIOMUX_INTROUTER_OUTP;
        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_rmIrqSetRaw(&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                 = MAIN_GPIO_MUX_INTROUTER_ID;
        rmIrqReq.src_index              = CSLR_MAIN_GPIOMUX_INTROUTER0_IN_GPIO0_GPIO_48;
        rmIrqReq.dst_id                 = MAIN_GPIO_MUX_INTROUTER_ID;
        rmIrqReq.dst_host_irq           = MAIN_GPIOMUX_INTROUTER_OUTP;
        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_rmIrqReleaseRaw(&rmIrqReq, SystemP_WAIT_FOREVER);
        if(0 != retVal)
        {
            DebugP_log("[Error] Sciclient event reset failed!!!\r\n");
            DebugP_assert(FALSE);
        }
    
        return;
    }

    我附加了一个配置 GPIO0_48 引脚类型中断的示例源代码。 PIN 的方向为输出。

    这里使用的版本是 SDK v12.00。

    Project - gpio_input_interrupt_am62px-sk_mcu-r5fss0-0_nortos_ti-arm-clang.zip

    此致、

    Tushar

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

    你好、 Tushar Thakur 

    我们已经使用了大多数可用的 MCU 域 GPIO。 我们需要添加大约 10 个额外的 GPIO、我们正在评估以下选项:

    1. 使用来自主域的 GPIO 并从 MCU R5 访问它们。
    2. 使用连接到 MCU 的外部 GPIO 扩展器。

    这些额外的 GPIO 中的大多数旨在用作中断输入。

    在继续之前、我们想了解为此使用主域 GPIO 的可行性。 是否可以路由和使用大约 10 个主域 GPIO 作为 MCU R5 内核的中断源?

    请问在 MCU 端使用大量主域 GPIO 中断时、在中断路由、资源分配或性能方面是否有任何限制或特殊注意事项?


    谢谢、
    Abhijith

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

    尊敬的 Abhijit:

    正如我之前的回复中所述、主域 GPIO 引脚也可以通过 MCU R5F 内核使用。 如果将中断配置为引脚类型、则只能使用两个主域 GPIO 引脚、该引脚必须来自不同的 GPIO 组。  

    或者、如果您使用主域 GPIO 引脚作为组中断、则最多可以使用 32 个 GPIO 引脚 使用的引脚应来自同一 GPIO 组。

    此致、

    Tushar

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

    尊敬的 Tushar Thakur 、
    如果我为 MCU 配置一个 GPIO 组中断、并将 5 个 GPIO 从该组连接到 MCU、同时该组中的其余 GPIO 由 A53 内核使用、组中断是否仅适用于 MCU 分配的 GPIO、或者它是否也会影响该组中由 A53 内核使用的其他 GPIO?
    如果正确、那么当该组内 A53 使用的引脚之一发生 GPIO 中断时、它是否也会触发 MCU 域中的相应中断?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我为 MCU 配置 GPIO 组中断并将 5 个 GPIO 从该组连接到 MCU、而同一组中的其余 GPIO 由 A53 内核使用、组中断是否仅适用于 MCU 分配的 GPIO、或者它是否也会影响该组中 A53 内核正在使用的其他 GPIO]

    一旦您将中断配置为组类型、同一组中的所有引脚都将受到影响并产生中断。

    如果确实如此、那么当该组内一个 A53 使用的引脚上发生 GPIO 中断时、它是否也会触发 MCU 域中的相应中断?

    是的、正确。

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

    尊敬的 Tushar Thakur 、

    是的、这是正确的。

    这是否意味着中断将路由到 MCU 并调用相应的 MCU ISR 回调?

    此外、如果我将 MCU 侧引脚配置为输出、并且不使用来自该 GPIO 组的任何输入中断、但 A53 为同一组启用组级中断、那么这可能会对 MCU 侧产生任何影响吗? 或者在这种情况下 MCU 是否不受影响?

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

    这里要说明的一点是、为了在 GPIO 模块中启用中断、我们为每个 GPIO 模块都提供了 BINTEN(用于组中断和引脚中断)寄存器。 这对于所有内核都是通用的、因此任何写入该寄存器的内核都将启用模块的 GPIO 中断。

    为模块中的 GPIO 组启用 GPIO 中断后、它适用于所有内核。  

    例如、如果您已将 GPIO0_5 配置为 MCU_R5F 内核上的组中断。 GPIO0_5 属于 BANK0、同一组中的所有引脚 (0-15) 将在 MCU_R5F 内核上生成中断、即使也被其他内核使用也是如此。

      有关详细信息、请参阅 GPIO 用例和使用 AM6x 系列 SitaraTm MPU 器件的实现。

    注意:此处的所有信息都与运行 FREERTOS/NoRTOS 的内核的上下文相关。 以上内容不适用于运行不同操作系统(即 Linux)的内核。