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.

[FAQ] [参考译文] [常见问题解答] MCU-PLUS-SDK-AM263X:配置 GPIO 中断

Guru**** 669750 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/1184311/faq-mcu-plus-sdk-am263x-configuring-gpio-interrupts

器件型号:MCU-PLUS-SDK-AM263X
Thread 中讨论的其他器件:SysConfig

你(们)好

如何在 AM263x 中为各个 GPIO 引脚配置 GPIO 中断。

它与 SDK 中现有的 GPIO 组中断配置示例有何不同。

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

    AM263x 中的 GPIO 引脚:

    AM263x 具有139个 GPIO 引脚

    该器件具有四个 GPIO 模块实例、每个 R5FSS 处理器内核有一个专用实例

    • Pinmux/IOMUX 允许使用4:1 MUX 将 GPO 引脚控制分配给特定的 R5FSS 处理器内核 (MCUSDK SysConfig 自动生成用于配置此功能的代码)
    • 所有处理器内核都可以观察到 GPI 引脚

    GPIO 模块最多能够支持144个专用引脚。 AM263x 实现了139引脚。

    AM263x 中的 GPIO 中断:

    关于中断、

    从 GPIO 模块中、180个事件/中断可作为 GPIO 中断 XBAR 的输入、如下图所示。  

    180个输入包含独立的 GPIO 中断(4个 GPIO 模块的144个复用)以及4个 GPIO 模块的9个组中断

      中断数量
    单个 GPIO 引脚中断 144.
    针对实例0的 GPIO 组中断 9.
    针对实例1的 GPIO 组中断 9.
    实例2的 GPIO 组中断 9.
    实例3的 GPIO 组中断 9.
    总输入 180

    下图来自 AM263 TRM -"图10-4. GPIO XBAR 中断路由器集成图"

    GPIO 中断路由至 R50_0:

    • VIM0连接到 R50_0。
    • 4个 GPIO INT_XBAR 可路由到 VIM_0、因此可路由到 R50_0内核。
    • 一个组中的所有 GPIO 引脚中断都路由在一起、连接到一个 GPIO 组中断例程、并且可以通过 GPIO_bankIntraEnable 启用此组中断
    • 同一 GPIO 组中的多个 GPIO 引脚不能具有唯一的 ISR。  

    组中断的 GPIO 配置:

    在当前 SDK 8.5中、我们有 使用 GPIO 组中断的 GPIO_INPUT_INTERRUPT 示例。 以下参考资料取自 GPIO 应用指南- https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/DRIVERS_GPIO_PAGE.html

    在该示例中、转到 SYSCFG -> GPIO INT XBAR 选项。

    为 HWIP 配置组中断时、可参考以下代码:

    static void GPIO_bankIsrFxn(void *args)
    {
        uint32_t    pinNum = (uint32_t) args, bankNum;
        uint32_t    intrStatus, pinMask = GPIO_GET_BANK_BIT_MASK(pinNum);
     
        bankNum = GPIO_GET_BANK_INDEX(pinNum);
        intrStatus = GPIO_getBankIntrStatus(gGpioBaseAddr, bankNum);
        GPIO_clearBankIntrStatus(gGpioBaseAddr, bankNum, intrStatus);
     
        if(intrStatus & pinMask)
        {
            /*
            * Handle all the expected pin interrupts within a bank using intrStatus flag
            */
        }
    }
     
    void gpio_bank_interrupt_init(void)
    {
        int32_t         retVal;
        uint32_t        pinNum = gGpioPinNum, bankNum;
        HwiP_Params     hwiPrms;
     
        bankNum = GPIO_GET_BANK_INDEX(pinNum);
     
        /* Interrupt setup */
        GPIO_setDirMode(gGpioBaseAddr, pinNum, GPIO_DIRECTION_INPUT);
        GPIO_setTrigType(gGpioBaseAddr, pinNum, GPIO_TRIG_TYPE_RISE_EDGE);
        GPIO_bankIntrEnable(gGpioBaseAddr, bankNum);
     
        /* Register bank interrupt */
        HwiP_Params_init(&hwiPrms);
        hwiPrms.intNum = gGpioBankIntrNum;
        hwiPrms.callback = &GPIO_bankIsrFxn;
        hwiPrms.args = (void *) pinNum;
        retVal = HwiP_construct(&gGpioHwiObject, &hwiPrms);
        if(SystemP_SUCCESS != retVal)
        {
            DebugP_assert(FALSE);
        }
    }
     
    void gpio_bank_interrupt_deinit(void)
    {
        uint32_t        pinNum = gGpioPinNum, bankNum, intrStatus;
     
        bankNum = GPIO_GET_BANK_INDEX(pinNum);
     
        /* Interrupt disable and clear any pending interrupts */
        GPIO_bankIntrDisable(gGpioBaseAddr, bankNum);
        GPIO_setTrigType(gGpioBaseAddr, pinNum, GPIO_TRIG_TYPE_NONE);
        intrStatus = GPIO_getBankIntrStatus(gGpioBaseAddr, bankNum);
        GPIO_clearBankIntrStatus(gGpioBaseAddr, bankNum, intrStatus);
     
        /* Unregister interrupt */
        HwiP_destruct(&gGpioHwiObject);
    }

    针对每个引脚中断的 GPIO 配置:

    要使用单独的 GPIO 中断、请将 XBAR 输出选项更改为您所需的相应 GPIO_MUX 引脚。 在这里、忽略此上下文中的"_MUX"、这仅指单独的 GPIO 引脚。

    为 HWIP 配置 PER 引脚中断时、可参考以下代码:

    static void GPIO_pinIsrFxn(void *args)
    {
        /*
         * Handle pin interrupt - This is pulse interrupt. No need to clear status
         */
    }
     
    void gpio_pin_interrupt_init(void)
    {
        int32_t         retVal;
        uint32_t        pinNum = gGpioPinNum, bankNum;
        HwiP_Params     hwiPrms;
     
        bankNum = GPIO_GET_BANK_INDEX(pinNum);
     
        /* Interrupt setup */
        GPIO_setDirMode(gGpioBaseAddr, pinNum, GPIO_DIRECTION_INPUT);
        GPIO_setTrigType(gGpioBaseAddr, pinNum, GPIO_TRIG_TYPE_RISE_EDGE);
        GPIO_bankIntrEnable(gGpioBaseAddr, bankNum);
     
        /* Register pin interrupt */
        HwiP_Params_init(&hwiPrms);
        hwiPrms.intNum = gGpioPinIntrNum;
        hwiPrms.callback = &GPIO_pinIsrFxn;
        hwiPrms.args = (void *) pinNum;
        retVal = HwiP_construct(&gGpioHwiObject, &hwiPrms);
        if(SystemP_SUCCESS != retVal)
        {
            DebugP_assert(FALSE);
        }
    }
     
    void gpio_pin_interrupt_deinit(void)
    {
        uint32_t        pinNum = gGpioPinNum, bankNum;
     
        bankNum = GPIO_GET_BANK_INDEX(pinNum);
     
        /* Interrupt disable and clear any pending interrupts */
        GPIO_bankIntrDisable(gGpioBaseAddr, bankNum);
        GPIO_setTrigType(gGpioBaseAddr, pinNum, GPIO_TRIG_TYPE_NONE);
        GPIO_clearIntrStatus(gGpioBaseAddr, pinNum);
     
        /* Unregister interrupt */
        HwiP_destruct(&gGpioHwiObject);
    }

    在确认和检查单个和组 GPIO 中断的中断状态时、可以使用以下 API:

    GPIO 组 各个 GPIO
    GPIO_getBankIntStatus GPIO_IntgetStatus
    GPIO_clearBankIntStatus GPIO_IntclearStatus

    谢谢、此致

    Sri Vidya