Thread 中讨论的其他器件:SysConfig
你(们)好
如何在 AM263x 中为各个 GPIO 引脚配置 GPIO 中断。
它与 SDK 中现有的 GPIO 组中断配置示例有何不同。
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.
你(们)好
如何在 AM263x 中为各个 GPIO 引脚配置 GPIO 中断。
它与 SDK 中现有的 GPIO 组中断配置示例有何不同。
AM263x 中的 GPIO 引脚:
AM263x 具有139个 GPIO 引脚
该器件具有四个 GPIO 模块实例、每个 R5FSS 处理器内核有一个专用实例
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:
组中断的 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