逆风之痰 2023-03-29 19:22 采纳率: 0%
浏览 153
已结题

TDA4 R5F核的GPIO外部中断基于SDK7.1的实现

目前在TDA4 main domain R5F1_0上需要开发两个GPIO脚的外部输入中断,这两个pin脚的ball name分别为 AB23 和 AG27,但是TI的AUTOSAR MCAL不支持ICU相关的配置,因此只能手动去调用sciclient接口去配置中断和GPIO。

目前不知道怎么配,PDK包中的example也没有相关的功能,目前有许多疑问:
疑问1: AB23和AG27这两个引脚都是一个bank的,TI的手册上写着同一个bank的引脚,中断回调都是同一个入口,如果要做成两个单独的中断回调函数是否不支持?
疑问2:pin脚和中断号以及中断回调函数如何用sciclient接口进行捆绑?
疑问3:外部输入的边沿的捕获触发条件如何设置?
疑问4:能不能用这两个引脚做个sample给我看看?

目前用的是CCS10.0的编译器,AUTOSAR操作系统(vector),SDK7.1

  • 写回答

6条回答 默认 最新

  • 叶秋学长 优质创作者: 编程框架技术领域 2023-03-29 19:46
    关注

    基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):
    疑问1: 在TDA4 main domain R5F1_0上,如果AB23和AG27这两个引脚都是一个bank的,那么它们共用同一个中断入口。如果需要将它们做成两个单独的中断回调函数,则需要在中断服务程序中进行判断,以区分不同的中断来源。

    疑问2: 要使用sciclient接口进行GPIO中断的配置,你需要先调用Sciclient_init函数进行初始化。然后,通过调用Sciclient_pmSetModuleState函数开启GPIO模块的电源和时钟,再通过调用Sciclient_pmSetResourceState函数使能引脚相应的GPIO资源。最后,调用GPIO_socGetInitCfg函数获取GPIO的默认配置,修改其中的相关参数,例如设置外部输入的边沿捕获触发条件等,最后调用GPIO_socSetInitCfg函数完成GPIO的初始化配置。

    疑问3: 外部输入的边沿捕获触发条件可以通过设置GPIO的InterruptType或者EventDetect属性来实现。例如,如果需要在上升沿触发中断,则可以通过将InterruptType属性设置为GPIO_INT_TYPE_RISING_EDGE来实现。

    疑问4: 可以通过以下代码片段初始化AB23和AG27两个引脚,并设置它们的中断回调函数:

    #include <ti/drv/gpio/GPIO.h>
    #include <ti/drv/sciclient/sciclient.h>
    
    #define AB23_PIN_NUM (23)
    #define AG27_PIN_NUM (27)
    #define APP_GPIO_INTERRUPT_ID1 (10U)
    #define APP_GPIO_INTERRUPT_ID2 (11U)
    
    /* 中断回调函数 */
    static void gpioCallbackFxn1(uintptr_t arg)
    {
        /* 你的中断处理代码 */
    }
    
    static void gpioCallbackFxn2(uintptr_t arg)
    {
        /* 你的中断处理代码 */
    }
    
    void gpioInterruptInit()
    {
        int32_t retVal;
        GPIO_v0_HwAttrs gpioCfg;
    
        /* 初始化Sciclient */
        retVal = Sciclient_init(NULL);
        if (retVal != CSL_PASS) {
            /* 错误处理 */
        }
    
        /* 设置GPIO模块的电源和时钟 */
        retVal = Sciclient_pmSetModuleState(TISCI_DEV_GPIO0, TISCI_MSG_VALUE_DEVICE_SW_STATE_ON, SCICLIENT_SERVICE_WAIT_FOREVER);
        if (retVal != CSL_PASS) {
            /* 错误处理 */
        }
    
        /* 使能引脚相应的GPIO资源 */
        retVal = Sciclient_pmSetResourceState(TISCI_DEV_GPIO0, AB23_PIN_NUM, TISCI_MSG_VALUE_DEVICE_SW_STATE_ON, SCICLIENT_SERVICE_WAIT_FOREVER);
        if (retVal != CSL_PASS) {
            /* 错误处理 */
        }
        retVal = Sciclient_pmSetResourceState(TISCI_DEV_GPIO0, AG27_PIN_NUM, TISCI_MSG_VALUE_DEVICE_SW_STATE_ON, SCICLIENT_SERVICE_WAIT_FOREVER);
        if (retVal != CSL_PASS) {
            /* 错误处理 */
        }
    
        /* 获取GPIO的默认配置 */
        GPIO_socGetInitCfg(0, &gpioCfg);
        /* 修改相关参数 */
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID1].intrNum = APP_GPIO_INTERRUPT_ID1;
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID1].intcFxn = gpioCallbackFxn1;
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID1].intcObj = NULL;
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID1].eventType = GPIO_INTR_CFG_EVENT_RISING_EDGE;
    
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID2].intrNum = APP_GPIO_INTERRUPT_ID2;
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID2].intcFxn = gpioCallbackFxn2;
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID2].intcObj = NULL;
        gpioCfg.interruptCfg[APP_GPIO_INTERRUPT_ID2].eventType = GPIO_INTR_CFG_EVENT_FALLING_EDGE;
    
        /* 初始化GPIO */
        retVal = GPIO_init(0, &gpioCfg);
        if (retVal != GPIO_RET_OK) {
            /* 错误处理 */
        }
    
        /* 配置AB23和AG27两个引脚,以捕获外部输入的中断信号 */
    GPIO_setConfig(0, AB23_PIN_NUM, GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING | GPIO_CFG_IN_INT_FALLING);
    GPIO_setConfig(0, AG27_PIN_NUM, GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING | GPIO_CFG_IN_INT_FALLING);
    
    /* 使能GPIO中断 */
    GPIO_enableInt(0, APP_GPIO_INTERRUPT_ID1);
    GPIO_enableInt(0, APP_GPIO_INTERRUPT_ID2);
    }
    
    

    需要注意的是,在使用这段代码之前,你需要先在板子上连接AB23和AG27两个引脚,并将它们分别连接到外部输入的信号源。此外,还需要将APP_GPIO_INTERRUPT_ID1和APP_GPIO_INTERRUPT_ID2两个中断ID与相应的中断控制器进行绑定,来确保中断服务程序能够正确地响应这两个中断。

    希望这些回答能够对你有所帮助。如果你还有其他问题或者疑惑,欢迎随时向我提问。

    评论

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 创建了问题 3月29日